Использование Clouni по протоколу gRPC

Вместо использования стандартного клиента Clouni пользователь может написать свой, либо использовать обращения к Clouni внутри своего приложения.

Для обеспечения такой возможности Clouni поддерживает обращения по протоколу gRPC.

Clouni provider tool и configuration tool

Proto файл описывающий вызовы API Clouni:

syntax = "proto3";

service ClouniProviderTool {
    rpc ClouniProviderTool(ClouniProviderToolRequest) returns (ClouniProviderToolResponse) {}
}

service ClouniConfigurationTool {
    rpc ClouniConfigurationTool(ClouniConfigurationToolRequest) returns (ClouniConfigurationToolResponse) {}
}

// ClouniProviderTool request
// Fields are specified in Clouni help

message ClouniProviderToolRequest {
    string template_file_content = 1;
    string cluster_name = 2;
    bool validate_only = 3;
    bool delete = 4;
    string provider = 5;
    string configuration_tool = 6;
    string extra = 7;
    string log_level = 8;
    bool debug = 9;
    string host_parameter = 10;
    string public_key_path = 11;
    string configuration_tool_endpoint = 12;
    string grpc_cotea_endpoint = 13;
    string database_api_endpoint = 14;
}

// ClouniProviderTool response
//      Status: TEMPLATE_VALID - returned for validate-only requests if template is valid
//              TEMPLATE_INVALID - returned for validate-only requests if template is invalid
//              OK - returned for normal execution of non-validate-only request
//              ERROR - returned if any error occured
//      Error: error description(only with ERROR status)
//      Content: content of proceeded template file(only with OK status)

message ClouniProviderToolResponse {
    enum Status {
        TEMPLATE_VALID = 0;
        TEMPLATE_INVALID = 1;
        OK = 2;
        ERROR = 3;
    }
    Status status = 1;
    string error = 2;
    string content = 3;
}

// ClouniProviderTool request
// Fields are specified in Clouni help

message ClouniConfigurationToolRequest {
    string provider_template = 1;
    string cluster_name = 2;
    bool validate_only = 3;
    bool delete = 4;
    string configuration_tool = 5;
    string extra = 6;
    string log_level = 7;
    bool debug = 8;
    string database_api_endpoint = 9;
    string grpc_cotea_endpoint = 10;
}

message ClouniConfigurationToolResponse {
    enum Status {
        TEMPLATE_VALID = 0;
        TEMPLATE_INVALID = 1;
        OK = 2;
        ERROR = 3;
    }
    Status status = 1;
    string error = 2;
    string content = 3;
}

Grpc-cotea

Proto файл описывающий вызовы API grpc-cotea:

syntax = "proto3";

service CoteaGateway {
   rpc StartSession(EmptyMsg) returns (StartSessionMSG) {}
   rpc InitExecution(Config) returns (Status) {}
   rpc RunTask(Task) returns (TaskResults) {}
   rpc StopExecution(SessionID) returns (Status) {}
   // rpc RestartExecution(SessionID) returns (Status) {}
}

service CoteaWorker {
   rpc InitExecution(WorkerConfig) returns (Status) {}
   rpc RunTask(WorkerTask) returns (TaskResults) {}
   rpc StopExecution(EmptyMsg) returns (Status) {}
   rpc HealthCheck(EmptyMsg) returns (WorkerHealthStatus) {}
   // rpc RestartExecution() returns (Status) {}
}

message StartSessionMSG {
   bool ok = 1;
   string ID = 2;
   string error_msg = 3;
}

message SessionID {
   string session_ID = 1;
}

message EmptyMsg {}

message MapFieldEntry {
   string key = 1;
   string value = 2;
} 

message Config {
   string session_ID = 1;
   string hosts = 2;
   string inv_path = 3;
   string extra_vars = 4;
   repeated MapFieldEntry env_vars = 5;
   string ansible_library = 6;
   bool not_gather_facts = 7;
}

message WorkerConfig {
   string hosts = 1;
   string inv_path = 2;
   string extra_vars = 3;
   repeated MapFieldEntry env_vars = 4;
   string ansible_library = 5;
   bool not_gather_facts = 6;
}

message Task {
   string session_ID = 1;
   string task_str = 2;
   bool is_dict = 3;
}

message WorkerTask {
   string task_str = 1;
   bool is_dict = 2;
}

message TaskResult {
   bool ok = 1;
   string results_dict_str = 2;
   string task_name = 3;
   bool is_changed = 4;
   bool is_failed = 5;
   bool is_skipped = 6;
   bool is_unreachable = 7;
   bool is_ignored_errors = 8;
   bool is_ignored_unreachable = 9;
   string stdout = 10;
   string stderr = 11;
   string msg = 12;
}

message TaskResults {
   bool task_adding_ok = 1;
   string task_adding_error = 2;
   repeated TaskResult task_results = 3;
}

message Status {
   bool ok = 1;
   string error_msg = 2;
}

message WorkerHealthStatus {
   bool ok = 1;
   int32 executions_count = 2;
   int32 executed_tasks_count = 3;
}