universe.workload.v1
This APIs are available for Tenants only
Proto file and generated GO client for the API can be found in universe-api repo
This API is served by universe-infra-workload-manager
The intent of this API is to send notifications about Workloads which running in the tenant cluster to infrastructure cluster.
universe-k8s-tenant-workload-plugin use this API.
Workload - API
            
            syntax = "proto3";
package universe.workload.v1;
// The following client metadata fields are used:
// "tenant-id" (required): tenant identifier
service WorkloadService {
  // WorkloadStream provide directional stream from client to server
  rpc WorkloadStream(stream WorkloadStreamRequest) returns (WorkloadStreamResponse) {}
}
// supported orchestrator type
enum OrchestratorType {
  ORCHESTRATOR_TYPE_UNSPECIFIED = 0;
  ORCHESTRATOR_TYPE_KUBERNETES = 1;
}
// WorkloadMetadata contains meta information about workload
message WorkloadMetadata {
  // unique workload ID, e.g. Pod resource UID for k8s
  string id = 1;
  // orchestrator identifier for the workload
  OrchestratorType orchestrator = 2;
  // resource type identifier in orchestrator, e.g. v1/Pod for k8s
  string resource_type = 3;
  // identifier of the orchestrator specific abstraction for resource
  // grouping/isolation,
  // for example for k8s - namespace, for Openstack - project.
  // if orchestrator has no concept similar to namespace/project/tenant this
  // field should be empty
  string resource_namespace = 4;
  // human readable identifier for resource with resource_type for orchestrator,
  // e.g. podName for k8s
  string resource_name = 5;
}
// WorkloadState contains complete description of the object state
// This message should reflect the current state of the object,
// not the fact that object was changed.
// That's mean that each field of the message can be set independently
// to provide an accurate description of the current state of the object.
message WorkloadState {
  // name of the node on which this workload is started
  string node_name = 1;
  // indicate if workload is in ready state
  bool ready = 2;
  // orchestrator-specific information which will help to identify resource
  // and describe its state
  message ExtraData {
    map<string, string> data = 1;
  }
  // contains ExtraData
  // for k8s it is expected that extra field will include labels and annotations keys
  // which will hold all labels and annotations of the workload in k8s cluster
  map<string, ExtraData> extra = 3;
}
// WorkloadUpdate contains workload metadata and workload state
message WorkloadUpdate {
  WorkloadMetadata workload_metadata = 1;
  WorkloadState workload_state = 2;
}
// WorkloadDelete message should be used to notify that workload was removed from the // cluster.
message WorkloadDelete {
  WorkloadMetadata workload_metadata = 1;
}
// WorkloadSync contains list of WorkloadUpdate objects
message WorkloadSync {
  repeated WorkloadUpdate workload_updates = 1;
}
// WorkloadStreamRequest contains messages which can be send by client
message WorkloadStreamRequest {
  oneof message {
    WorkloadUpdate workload_update = 1;
    WorkloadDelete workload_delete = 2;
    WorkloadSync workload_sync = 3;
  }
}
// WorkloadStreamResponse contains messages which can be send by server
message WorkloadStreamResponse {}
    
This API is served by universe-infra-workload-rule-manager
This API provide a way to define Tenant workload rules in infrastructure cluster.
universe-k8s-tenant-workload-rule-plugin use this API.
Examples
check Manual GRPC API usage doc before start
Here some examples using ‘grpcurl’ tool to access the API:
Replace $API_GW_ADDRESS with address of iCP API GW in your environment
Replace $TENANT_ID with existing tenant id
List WorkloadRules
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -H tenant-id:$TENANT_ID \
    -proto universe/workload/v1/workload_rule.proto $API_GW_ADDRESS \
     universe.workload.v1.WorkloadRuleService.List
    
Get WorkloadRule
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -H tenant-id:$TENANT_ID \
    -d '{"id": "tenantrule1"}' \
    -proto universe/workload/v1/workload_rule.proto $API_GW_ADDRESS \
     universe.workload.v1.WorkloadRuleService.Get
    
Delete WorkloadRule
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -H tenant-id:$TENANT_ID \
    -d '{"id": "tenantrule1"}' \
    -proto universe/workload/v1/workload_rule.proto $API_GW_ADDRESS \
     universe.workload.v1.WorkloadRuleService.Delete
    
Create WorkloadRule
Create and Update requests contain binary fields. grpcurl utility requires
binary fields to be encoded to base64 encoded before they can be used as request parameters.
            
            # put base64 encoded Pod spec to RULE_TEMPLATE shel variable
RULE_TEMPLATE=$(cat << EOM | base64 -w0
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "nginx"
},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx:1.14.2",
"ports": [
{
"containerPort": 80
}
]
}
]
}
}
EOM
)
# -d @ argument for grpcurl mean read arguments from STDIN
# use content of RULE_TEMPLATE shel variable as rule.data.rule_template
grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -H tenant-id:$TENANT_ID \
    -d @ -proto universe/workload/v1/workload_rule.proto $API_GW_ADDRESS \
     universe.workload.v1.WorkloadRuleService.Create << EOM
{
"rule": {
"id": "tenantrule1",
"data": {
"orchestrator_type": 1,
"resource_type": "v1/Pod",
"dpu_selection_policy": "Any",
"workload_terms": [
{
"match_expressions": [
{
"key": "metadata.resourceNamespace",
"operation": 1,
"values": [
"default"
]
}
]
}
],
"workload_info_inject": [
{
"key": "@",
"as_annotation": {
"name": "full-workload-info"
}
}
],
"rule_template": "$RULE_TEMPLATE"
}
}
}
EOM
    
WorkloadRule - API
            
            syntax = "proto3";
package universe.workload.v1;
import "universe/workload/v1/workload.proto";
// The following client metadata fields are used:
// "tenant-id" (required): tenant identifier
service WorkloadRuleService {
  // create a new workload rule, return error if rule already exist
  rpc Create(CreateRequest) returns (CreateResponse) {}
  // update existing workload rule, return error if rule not found
  rpc Update(UpdateRequest) returns (UpdateResponse) {}
  // delete existing workload rule
  rpc Delete(DeleteRequest) returns (DeleteResponse) {}
  // get specific instance of workload rule
  rpc Get(GetRequest) returns (GetResponse) {}
  // list all workload rules
  rpc List(ListRequest) returns (ListResponse) {}
}
message Rule {
  // unique rule id
  string id = 1;
  // rule config
  RuleData data = 2;
}
message RuleData {
  // orchestrator type for workload that shall be matched by this rule
  OrchestratorType orchestrator_type = 1;
  // orchestrator specific resource type for workload that shall be matched by this rule
  string resource_type = 2;
  // workload match terms
  // if multiple match terms specified they will be ORed,
  // rule will match workload if at least one RuleWorkloadTerm matches workload
  repeated RuleWorkloadTerm workload_terms = 3;
  // dpu selection policy, can be SameNode or Any
  string dpu_selection_policy = 4;
  // workload inject settings
  repeated WorkloadInfoInject workload_info_inject = 5;
  // template of the resource which will be created if rule matches workload
  bytes rule_template = 6;
}
// contains match expressions which will be used to examine workload
// match_expressions are ANDed, workloadTerm is true if all match expressions
// inside it are true
message RuleWorkloadTerm {
  repeated RuleMatchExpression match_expressions = 1;
}
// expression to check workload field
message RuleMatchExpression {
  // name of the workload field in JSONPath format
  string key = 1;
  // operation field should be set, UNSPECIFIED value will
  // return error
  enum Operation {
    // invalid request
    OPERATION_UNSPECIFIED = 0;
    // value from workload[RuleMatchExpression.key]
    // should be in RuleMatchExpression.values list
    OPERATION_IN = 1;
    // value from workload[RuleMatchExpression.key]
    // should not be in RuleMatchExpression.values list
    OPERATION_NOT_IN = 2;
    // workload object should have RuleMatchExpression.key
    OPERATION_EXISTS = 3;
    // workload object should not have RuleMatchExpression.key
    OPERATION_DOES_NOT_EXIST = 4;
    // value from workload[RuleMatchExpression.key] should be greater than
    // RuleMatchExpression.values[0]
    OPERATION_GT = 5;
    // value from workload[RuleMatchExpression.key] should be less than
    // RuleMatchExpression.values[0]
    OPERATION_LT = 6;
  }
  // operation to use for key examination
  Operation operation = 2;
  // values to use for examination
  // should contain one or more values if operation is IN and NOT_IN,
  // should contain single element if operation is EXISTS and DOES_NOT_EXIST,
  // should contains single element convertible to integer is operation is GT and LT
  repeated string values = 3;
}
// hold different kind of inject configurations
message WorkloadInfoInject {
  string key = 1;
  oneof message {
    // hold configuration for AsAnnotation inject method
    WorkloadInfoInjectConfigAsAnnotation as_annotation = 2;
  }
}
message WorkloadInfoInjectConfigAsAnnotation {
  string name = 1;
}
// message for create request
message CreateRequest {
  // full rule object
  Rule rule = 1;
}
// message for update request
message UpdateRequest {
  // full rule object
  Rule rule = 1;
}
// message for delete request
message DeleteRequest {
  // id of a rule to remove
  string id = 1;
}
// message for get request
message GetRequest {
  // id of a rule to retrieve
  string id = 1;
}
// message for list request
// no parameters supported for now
message ListRequest {}
// message for response of the create request
message CreateResponse {}
// message for response of the update request
message UpdateResponse {}
// message for response of the delete request
message DeleteResponse {}
// message for response of the get request
message GetResponse {
  // contains single rule spec
  Rule rule = 1;
}
// message for response of the list request
message ListResponse {
  // list of rules with specs
  repeated Rule rules = 1;
}