universe.admin.provisioning.v1
This API is available for CloudAdmin only
Proto file and generated GO client for the API can be found in universe-api repo
This API is served by universe-infra-provisioning-manager
The intent of this API is to provide a way to provision DPUs in the infrastructure cluster by creating Universe provisioning CRDs.
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
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d '{"name": "tenantA"}' \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.CreateTenant
    
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d '{"name": "settingsA"}' \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.DeleteSettings
    
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.ListSettings
    
Update methods require the full object and not only the fields needed to be updated.
Filtering
List APIs have optional filtering options: Field Matcher, List Matcher and Map Matcher. Multiple filters can be used on the same API call.
Here some examples of filters:
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d '{"filters":[{"field_matcher":{"field_path":".name","operation":1,"values":["tenantA"]}}]}' \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.ListTenant
    
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d '{"filters": [{"map_matcher": {"map_path": ".labels","field_matchers":[{"field_path":"$","operation":1,"values":["blue"]}],"key_matcher": {"operation": 1,"keys": ["color"]}}}]}' \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.ListDPU
    
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d '{"filters": [{"list_matcher": {"list_path": ".packages","field_matchers":[{"field_path":".version","operation":1,"values":["0.01"]}]}}]}' \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.ListSettings
    
Provisioning
Here some examples of DPU provisioning:
Create credential
The provisioning components need BMC’s credentials to be able to access the DPU’s BMC. In the DPU BMC, a privileged BMC user needs to be created, and also it is needed to enable permissions to execute IPMI commands remotely for users with admin permissions.
            
            cat << EOF | tee cred.json
{
"cred":{
"name":"dpu1-host-a-secret",
"user_name": <user name of BMC>,
"password": <password of BMC>
}
}
EOF
grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d "$(cat cred.json | tr -d '\n')" \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.CreateCredential
    
Create settings
Settings includes the information for DPU to do provisioning.
‘osImage’ is required. This is used to deploy DPU OS image.
‘bmcFirmwareImage’ is optional. This is used to update BMC firmware.
‘firmwareImage’ is optional. This is used to update MLX firmware manager.
‘staticPods’ is optional. Static Pods are managed directly by the kubelet daemon on a specific node, without the API server observing them. The kubelet on DPU will start the static Pods after DPU provisioning. It should be passed in base64 format.
‘preStageScripts’ is optional. List of custom scripts executed before kubeadm init/join. Scripts are launched in the specified order and should be passed in base64 format. Reboot operation usage is prohibited inside scripts.
‘postStageScripts’ is optional. List of custom scripts executed after kubeadm init/join. Scripts are launched in the specified order and should be passed in base64 format. Reboot operation usage is prohibited inside scripts.
The universe-infra-provisioning-bootp components integrates a http server which provides ‘osImage’, ‘bmcFirmwareImage’, ‘firmwareImage’ images and image’s md5sum download service.
Here is the sample of ‘settings’ creation request:
            
            # Static pod
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
)
# Pre stage script
cat << EOS | tee script_pre.sh
#!/bin/bash
echo It is pre stage script
EOS
SCRIPT_PRE_BASE64=$(base64 script_pre.sh)
# Post stage script
cat << EOS | tee script_post.sh
#!/bin/bash
echo It is post stage script
EOS
SCRIPT_POST_BASE64=$(base64 script_post.sh)
cat << EOF | tee settings.json
{
"settings":{
"linkType": "LINK_TYPE_ETH",
"name": dpu1-host-a-settings",
"osImage": {
"url": "<URL of OS image>",
"checksum": "<URL of OS image's md5sum>",
"checksumType": "CHECKSUM_TYPE_MD5",
"diskFormat": "DISK_FORMAT_RAW"
},
"bmcFirmwareImage": {
"url": "<URL of BMC firmware image>",
"checksum": "<URL of BMC firmware image's md5sum>",
"checksumType": "CHECKSUM_TYPE_MD5"
},
"firmwareImage": {
"url": "<URL of MLX firmware manager image>",
"checksum": "<URL of MLX firmware manager image's md5sum>",
"checksumType": "CHECKSUM_TYPE_MD5"
},
"staticPods": ["POD_SYMBOL"],
"preStageScripts": ["${SCRIPT_PRE_BASE64}"],
"postStageScripts": ["${SCRIPT_POST_BASE64}"]
}
}
EOF
sed -i "s/POD_SYMBOL/${RULE_TEMPLATE}/g" settings.json
grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d "$(cat settings.json | tr -d '\n')" \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.CreateSettings
    
Create host
            
            cat << EOF | tee host.json
{
"host":{
"name":"host-a"
}
}
EOF
grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d "$(cat host.json | tr -d '\n')" \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.CreateHost
    
Create DPU
            
            cat << EOF | tee dpu.json
{
"dpu":{
"name":"dpu1-host-a",
"bmc":{
"url":"dpu://<BMC IP Address>",
"credential_ref":{
"name":"dpu1-host-a-secret"
}
},
"boot_mac_address":"<DPU MAC Address>",
"target_settings":{
"name":"dpu1-host-a-settings"
},
"host_ref":{
"name": "host-a"
}
}
}
EOF
grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d "$(cat dpu.json | tr -d '\n')" \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.CreateDPU
    
Get DPU
            
            grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local \
    -proto universe/admin/provisioning/v1/provisioning.proto \
    -d '{"name": "dpu1-host-a"}' \
    $API_GW_ADDRESS \
    universe.admin.provisioning.v1.UniverseProvisioningService.GetDPU
    
            
            {
  "dpu": {
    "name": "dpu1-host-a",
    "hostRef": {
      "name": "host-a",
      "uid": ""
    },
    "bmc": {
      "url": "dpu://<BMC IP Address>",
      "credentialRef": {
        "name": "dpu1-host-a-secret",
        "namespace": ""
      }
    },
    "bootMacAddress": "<DPU MAC Address>",
    "targetSettings": {
      "name": "dpu1-host-a-settings",
      "uid": ""
    },
    "status": {
      "conditions": [
        {
          "type": "Ready",
          "status": "STATUS_FALSE",
          "lastTransitionTime": "2022-11-09 12:38:23 +0000 UTC",
          "reason": "MachineStateProvisioning",
          "message": ""
        },
        {
          "type": "ProvisioningStarted",
          "status": "STATUS_TRUE",
          "lastTransitionTime": "2022-11-09 12:38:23 +0000 UTC",
          "reason": "ProvisioningStarted",
          "message": "ProvisioningStarted"
        }
      ]
    }
  }
}
    
            
            syntax = "proto3";
package universe.admin.provisioning.v1;
// UniverseProvisioningService is a service used to perform CRUD operations on Universe Infra Provisioning Objects
service UniverseProvisioningService {
  // create a new tenant, return error if tenant already exists
  rpc CreateTenant(CreateTenantRequest) returns (CreateTenantResponse) {}
  // delete existing tenant, return error if tenant does not exist
  rpc DeleteTenant(DeleteTenantRequest) returns (DeleteTenantResponse) {}
  // get specific instance of tenant, return error if tenant does not exist
  rpc GetTenant(GetTenantRequest) returns (GetTenantResponse) {}
  // list all tenants
  rpc ListTenant(ListTenantRequest) returns (ListTenantResponse) {}
  // create a new host, return error if host already exists
  rpc CreateHost(CreateHostRequest) returns (CreateHostResponse) {}
  // delete existing host, return error if host does not exist
  rpc DeleteHost(DeleteHostRequest) returns (DeleteHostResponse) {}
  // update existing host, return error if host does not exist
  rpc UpdateHost(UpdateHostRequest) returns (UpdateHostResponse) {}
  // get specific instance of host, return error if host does not exist
  rpc GetHost(GetHostRequest) returns (GetHostResponse) {}
  // list all hosts
  rpc ListHost(ListHostRequest) returns (ListHostResponse) {}
  // inform that the host admin required action was done
  // Notice, make sure that the required actions has been performed correctly, DCM will not validate that.
  rpc HostAdminActionDone(HostAdminActionDoneRequest) returns (HostAdminActionDoneResponse) {}
  rpc CreateCredential(CreateCredentialRequest) returns (CreateCredentialResponse) {}
  rpc DeleteCredential(DeleteCredentialRequest) returns (DeleteCredentialResponse) {}
  // create a new hostConfiguration, return error if hostConfigurationalready exists
  rpc CreateHostConfig(CreateHostConfigRequest) returns (CreateHostConfigResponse) {}
  // delete existing hostConfiguration, return error if hostConfigurationdoes not exist
  rpc DeleteHostConfig(DeleteHostConfigRequest) returns (DeleteHostConfigResponse) {}
  // get specific instance of hostConfiguration, return error if hostConfigurationdoes not exist
  rpc GetHostConfig(GetHostConfigRequest) returns (GetHostConfigResponse) {}
  // list all hostConfigurations
  rpc ListHostConfig(ListHostConfigRequest) returns (ListHostConfigResponse) {}
  // create a new DPU, return error if DPU already exists
  rpc CreateDPU(CreateDPURequest) returns (CreateDPUResponse) {}
  // delete existing DPU, return error if DPU does not exist
  rpc DeleteDPU(DeleteDPURequest) returns (DeleteDPUResponse) {}
  // update existing DPU, return error if DPU does not exist
  rpc UpdateDPU(UpdateDPURequest) returns (UpdateDPUResponse) {}
  // get specific instance of DPU, return error if DPU does not exist
  rpc GetDPU(GetDPURequest) returns (GetDPUResponse) {}
  // list all DPUs
  rpc ListDPU(ListDPURequest) returns (ListDPUResponse) {}
  // create a new rollout, return error if rollout already exists
  rpc CreateRollout(CreateRolloutRequest) returns (CreateRolloutResponse) {}
  // delete existing rollout, return error if rollout does not exist
  rpc DeleteRollout(DeleteRolloutRequest) returns (DeleteRolloutResponse) {}
  // update existing rollout, return error if rollout does not exist
  rpc UpdateRollout(UpdateRolloutRequest) returns (UpdateRolloutResponse) {}
  // get specific instance of rollout, return error if rollout does not exist
  rpc GetRollout(GetRolloutRequest) returns (GetRolloutResponse) {}
  // list all rollouts
  rpc ListRollout(ListRolloutRequest) returns (ListRolloutResponse) {}
  // create new settings, return error if settings already exist
  rpc CreateSettings(CreateSettingsRequest) returns (CreateSettingsResponse) {}
  // delete existing settings, return error if settings do not exist
  rpc DeleteSettings(DeleteSettingsRequest) returns (DeleteSettingsResponse) {}
  // get specific instance of settings, return error if settings do not exist
  rpc GetSettings(GetSettingsRequest) returns (GetSettingsResponse) {}
  // list all settings
  rpc ListSettings(ListSettingsRequest) returns (ListSettingsResponse) {}
}
// Tenant is a message that contains a Tenant object and its fields
message Tenant {
  // unique name for tenant
  string name = 1;
}
// Host is a message that contains a Host object and its fields
message Host {
  // Host.Status is a message that contains a Host status
  message Status {
    // conditions reflecting the current state of the host
    repeated Condition conditions = 1;
  }
  // unique name for Host
  string name = 1;
  //uuid of Host
  optional string uid = 2;
  // map of labels
  map<string, string> labels = 3;
  // status of the host
  optional Status status = 4;
}
// Host is a message that contains a BMC object and its fields
message BMC {
  // URL for accessing the BMC controller on the network
  string url = 1;
  ObjectRef credential_ref = 2;
}
message ObjectRef {
  string name = 1;
  optional string namespace = 2;
}
// HostConfig is a message that contains a HostConfig object and its fields
message HostConfig {
  // HostConfig.Status is a message that contains a HostConfiguration status
  message Status {
    // conditions reflecting the current state of the HostConfiguration
    repeated Condition conditions = 1;
  }
  // unique name for hostConfig
  string name = 1;
  // name of the host that this hostConfig points to
  string host_name = 2;
  // name of the tenant that this hostConfig points to
  string tenant_name = 3;
  // status of the hostConfig
  optional Status status = 4;
}
// DPU is a message that contains a DPU object and its fields
message DPU {
  // DPU.ProvisioningStatus is a message that contains the current state of the DPU provisioning
  message ProvisioningStatus {
    // Image parameters for downloading firmware
    FirmwareImage firmware_image = 1;
    // Image parameters for downloading BMC firmware
    BMCImage bmc_firmware_image = 2;
    // Image parameters for downloading OS image
    OSImage os_image = 3;
    // List of packages installed
    repeated PackageSpec packages = 4;
    // List of configurations set
    repeated Flag flags = 5;
    // List of static pods running in JSON format converted to bytes
    repeated bytes static_pods = 7;
    // Link type configuration, can be ethernet or infiniband
    LinkType link_type = 8;
    // List of custom scripts executed before kubeadm init/join
    repeated bytes pre_stage_scripts = 9;
    // List of custom scripts executed after kubeadm init/join
    repeated bytes post_stage_scripts = 10;
  }
  // DPU.NIC describes one network interface on the DPU.
  message NIC {
    // The name of the network interface, e.g. "en0"
    string name = 1;
    // The vendor and product IDs of the NIC, e.g. "0x8086 0x1572"
    optional string model = 2;
    // The device MAC address
    optional string mac = 3;
    // The device GUID
    optional string guid = 4;
    // The IP address of the interface. This will be an IPv4 or IPv6 address
    // if one is present. If both IPv4 and IPv6 addresses are present in a
    // dual-stack environment, two nics will be output, one with each IP.
    optional string ip = 5;
  }
  // DPU.InventoryInformation is a message that contains hardware information of the DPU
  message InventoryInformation {
    // Serial Number of the DPU
    string serial_number = 1;
    // Product Name of the DPU
    string product_name = 2;
    // List of NICs in the DPU
    repeated NIC nics = 3;
  }
  // DPU.Status is a message that contains a DPU status
  message Status {
    // Current packages/images running on DPU
    ProvisioningStatus provisioning = 1;
    // conditions reflecting the current state of the DPU
    repeated Condition conditions = 2;
    // Hardware inventory
    InventoryInformation inventory_information = 3;
  }
  // unique name for DPU
  string name = 1;
  // reference to the host that this DPU points to
  Ref host_ref = 2;
  // map of labels
  map<string, string> labels = 3;
  // BMC configuration
  optional BMC bmc = 4;
  // boot MAC address of the DPU
  optional string boot_mac_address = 5;
  // the immediate reconciliation Settings target
  optional Ref settings = 6;
  // the ultimate reconciliation Settings target
  optional Ref target_settings = 7;
  // status of the DPU
  optional Status status = 8;
}
// Ref is a message that contains a reference to another object
message Ref {
  // name of the referenced object
  string name = 1;
  // UUID of the referenced object
  optional string uid = 2;
}
message Credential {
  string name = 1;
  string user_name = 3;
  string password = 4;
}
// Settings is a message that contains a Settings object and its fields
message Settings {
  // Settings.Status is a message that contains the success count of DPU provisioned with this Settings
  message Status {
    // number of successful provisioning of DPUs with this settings
    int32 successes = 1;
    // number of failed provisioning of DPUs with this settings
    int32 failures = 2;
  }
  // unique name for settings
  string name = 1;
  // Image parameters for downloading firmware
  FirmwareImage firmware_image = 2;
  // Image parameters for downloading BMC firmware
  BMCImage bmc_firmware_image = 3;
  // Image parameters for downloading OS image
  OSImage os_image = 4;
  // List of packages to be installed
  repeated PackageSpec packages = 5;
  // List of configurations to set
  repeated Flag flags = 6;
  // List of static pods to run in JSON format converted to bytes
  repeated bytes static_pods = 7;
  // status of the Settings
  optional Status status = 8;
  // Link type configuration, can be ethernet or infiniband
  LinkType link_type = 9;
  // List of custom scripts executed before kubeadm init/join
  repeated bytes pre_stage_scripts = 10;
  // List of custom scripts executed after kubeadm init/join
  repeated bytes post_stage_scripts = 11;
}
// LinkType represent the mode the DPU link is configured
enum LinkType {
  // invalid value
  LINK_TYPE_UNSPECIFIED = 0;
  // ethernet type
  LINK_TYPE_ETH = 1;
  // infiniband type
  LINK_TYPE_IB = 2;
}
// Rollout is a message that contains a Rollout object and its fields
message Rollout {
  // Strategy is an enum for the possible provisioning strategies
  enum Strategy {
    // invalid value
    STRATEGY_UNSPECIFIED = 0;
    // provisioning is performed incrementally
    STRATEGY_ROLLING_UPDATE = 1;
    // provisioning is triggered externally
    STRATEGY_EXT_SCHEDULED = 2;
  }
  // Rollout.Status is a message that contains the count of DPU/host in process by this Rollout
  message Status {
    // number of provisioned Hosts
    int32 completed_hosts = 1;
    // number of provisioned DPUs
    int32 completed_dpus = 2;
    // number of pending DPUs to be provisioned
    int32 pending_hosts = 3;
    // number of pending Hosts to be provisioned
    int32 pending_dpus = 4;
  }
  // unique name for rollout
  string name = 1;
  // strategy for DPU provisioning
  Strategy strategy = 2;
  // in case of ROLLING_UPDATE strategy, max number of DPUs allowed to be unavailable
  // can be a number or a percentage
  optional string max_unavailable = 3;
  // settings used for the DPU rollout provisioning
  Ref target_settings = 4;
  // map of labels used to select the DPUs that will be affected by this Rollout
  map<string, string> dpu_selector = 5;
  // status of the Rollout
  optional Status status = 6;
}
// Label is a message that contains a Label object and its fields
message Label {
  // name of label
  string name = 1;
  // value of label
  string value = 2;
}
// Condition is a message that contains a Condition object and its fields
message Condition {
  // Status is an enum status of the condition, one of True, False, Unknown.
  enum Status {
    // invalid value
    STATUS_UNSPECIFIED = 0;
    // condition is True
    STATUS_TRUE = 1;
    // condition is False
    STATUS_FALSE = 2;
    // condition is Unknown
    STATUS_UNKNOWN = 3;
  }
  // type of condition
  string type = 1;
  // status of condition
  Status status = 2;
  // time of last transition of status
  string last_transition_time = 3;
  // reason of condition status
  string reason = 4;
  // message describing the status
  optional string message = 5;
}
// PackageSpec is a message that contains a PackageSpec object and its fields
message PackageSpec {
  // name of package
  string name = 1;
  // version of package
  string version = 2;
}
// OSImage is a message that contains a OSImage object and its fields
message OSImage {
  // location of an image to deploy
  string url = 1;
  // checksum for the image
  string checksum = 2;
  // checksum_type for the image
  ChecksumType checksum_type = 3;
  // disk_format contains the format of the image (raw, qcow2, ...).
  optional DiskFormat disk_format = 4;
}
// FirmwareImage is a message that contains a FirmwareImage object and its fields
message FirmwareImage {
  // location of an image to deploy
  string url = 1;
  // checksum for the image
  string checksum = 2;
  // checksum_type for the image
  ChecksumType checksum_type = 3;
  // force_update indicates an image will always be updated even if the version of image is lower or equal to the current version,
  // it will make the process longer but makes sure new FW is always installed. Default value is false
  optional bool force_update = 5;
}
// BMCImage is a message that contains a BMCImage object and its fields
message BMCImage {
  // location of an image to deploy
  string url = 1;
  // checksum for the image
  string checksum = 2;
  // checksum_type for the image
  ChecksumType checksum_type = 3;
}
enum ChecksumType {
  // invalid request
  CHECKSUM_TYPE_UNSPECIFIED = 0;
  CHECKSUM_TYPE_MD5 = 1;
  CHECKSUM_TYPE_SHA256 = 2;
  CHECKSUM_TYPE_SHA512 = 3;
}
enum DiskFormat {
  // invalid request
  DISK_FORMAT_UNSPECIFIED = 0;
  DISK_FORMAT_RAW = 1;
  DISK_FORMAT_QCOW2 = 2;
  DISK_FORMAT_VDI = 3;
  DISK_FORMAT_VDMK = 4;
  DISK_FORMAT_LIVE_ISO = 5;
}
// Flag is a message that contains a Flag object and its fields
message Flag {
  // name of the flag
  string name = 1;
  // value of the flag
  string value = 2;
}
message Filter {
  oneof matcher {
    // Matcher for specific field
    FieldMatcher field_matcher = 1;
    // Matcher for list
    ListMatcher list_matcher = 2;
    // Matcher for map
    MapMatcher map_matcher = 3;
  }
}
enum MatchOperation {
  // invalid request
  MATCH_OPERATION_UNSPECIFIED = 0;
  // value from message field
  // should be in matcher values list
  MATCH_OPERATION_IN = 1;
  // value from message field
  // should not be in matcher values list
  MATCH_OPERATION_NOT_IN = 2;
}
message FieldMatcher {
  // name of the message field in JSONPath format
  string field_path = 1;
  // operation to use for key examination
  MatchOperation operation = 2;
  // values to use for examination
  repeated string values = 3;
}
message ListMatcher {
  // name of the message list in JSONPath format
  string list_path = 1;
  // FieldMatcher to match value
  repeated FieldMatcher field_matchers = 2;
}
message KeysMatcher {
  // operation to use for keys examination
  MatchOperation operation = 1;
  // keys to use for examination
  repeated string keys = 2;
}
message MapMatcher {
  // name of the message map in JSONPath format
  string map_path = 1;
  // KeysMatcher to match key
  KeysMatcher key_matcher = 2;
  // FieldMatcher to match value
  repeated FieldMatcher field_matchers = 3;
}
// ----------
// TENANT
// ----------
// CreateTenantRequest is used to create a Tenant in the infrastructure cluster
message CreateTenantRequest {
  // Name of the tenant to create
  string name = 1;
}
// Keep empty for now, later on rpc may be extended
message CreateTenantResponse {}
// DeleteTenantRequest is used to delete already existing Tenant in the infrastructure cluster
message DeleteTenantRequest {
  // Name of the tenant to delete
  string name = 1;
}
// Keep empty for now, later on rpc may be extended
message DeleteTenantResponse {}
// GetTenantRequest is used to get an existing Tenant in the infrastructure cluster
message GetTenantRequest {
  // Name of the tenant to retrieve
  string name = 1;
}
// GetTenantResponse is a message containing the required Tenant object
message GetTenantResponse {
  // contains a single tenant
  Tenant tenant = 1;
}
// ListTenantRequest is used to list existing Tenant objects
message ListTenantRequest {
  repeated Filter filters = 1;
}
// ListTenantResponse contains the list of Tenants requested with ListTenantRequest
message ListTenantResponse {
  // list of tenants
  repeated Tenant tenants = 1;
}
// ----------
// HOST
// ----------
// CreateHostRequest is used to create a Host in the infrastructure cluster
message CreateHostRequest {
  // full host object
  Host host = 1;
}
// Keep empty for now, later on rpc may be extended
message CreateHostResponse {}
// DeleteHostRequest is used to delete already existing Host in the infrastructure cluster
message DeleteHostRequest {
  // Name of the host to delete
  string name = 1;
}
// Keep empty for now, later on rpc may be extended
message DeleteHostResponse {}
// GetHostRequest is used to get an existing Host in the infrastructure cluster
message GetHostRequest {
  // name of the host to retrieve
  string name = 1;
}
// GetHostResponse is a message containing the required Host object
message GetHostResponse {
  // contains a single host
  Host host = 1;
}
// ListHostRequest is used to list existing Hosts objects
message ListHostRequest {
  repeated Filter filters = 1;
}
// ListHostResponse contains the list of Hosts requested with ListHostRequest
message ListHostResponse {
  // list of hosts
  repeated Host hosts = 1;
}
// UpdateHostRequest is used to update an existing Host in the infrastructure cluster
message UpdateHostRequest {
  // host object with fields to update
  Host host = 1;
}
// Keep empty for now, later on rpc may be extended
message UpdateHostResponse {}
// The action host admin was required to perform
enum HostAdminAction {
  // invalid request
  HOST_ADMIN_ACTION_UNSPECIFIED = 0;
  // reboot the host
  HOST_ADMIN_ACTION_REBOOT = 1;
}
// HostAdminActionDoneRequest informs that the host admin required action was done
message HostAdminActionDoneRequest {
  // The name of the host action was performed on
  string host_name = 1;
  // The action host admin was required to perform
  HostAdminAction action = 2;
}
// Keep empty for now, later on rpc may be extended
message HostAdminActionDoneResponse {}
// ----------
// CREDENTIAL
// ----------
// CreateCredentialRequest is used to create a Credential in the infrastructure cluster
message CreateCredentialRequest {
  Credential cred = 1;
}
// Keep empty for now, later on rpc may be extended
message CreateCredentialResponse {}
// DeleteCredentialRequest is used to delete a Credential in the infrastructure cluster
message DeleteCredentialRequest {
  string credential_name = 1;
}
// Keep empty for now, later on rpc may be extended
message DeleteCredentialResponse {}
// ----------
// HOSTCONFIGURATION
// ----------
// CreateHostConfigRequest is used to create a HostConfiguration in the infrastructure cluster
message CreateHostConfigRequest {
  HostConfig host_config = 1;
}
// Keep empty for now, later on rpc may be extended
message CreateHostConfigResponse {}
// DeleteHostConfigRequest is used to delete already existing HostConfiguration in the infrastructure cluster
message DeleteHostConfigRequest {
  // Name of the HostConfiguration to delete
  string name = 1;
}
// Keep empty for now, later on rpc may be extended
message DeleteHostConfigResponse {}
// GetHostConfigRequest is used to get an existing HostConfiguration in the infrastructure cluster
message GetHostConfigRequest {
  // name of the hostConfiguration to retrieve
  string name = 1;
}
// GetHostConfigResponse is a message containing the required HostConfiguration object
message GetHostConfigResponse {
  // contains a single hostConfig
  HostConfig host_config = 1;
}
// ListHostConfigRequest is used to list existing HostConfiguration objects
message ListHostConfigRequest {
  repeated Filter filters = 1;
}
// ListHostConfigResponse contains the list of HostConfiguration requested with ListHostConfigRequest
message ListHostConfigResponse {
  // list of hostConfigurations
  repeated HostConfig host_configs = 1;
}
// ----------
// DPU
// ----------
// CreateDPURequest is used to create a DPU in the infrastructure cluster
message CreateDPURequest {
  // full DPU object
  DPU dpu = 1;
}
// Keep empty for now, later on rpc may be extended
message CreateDPUResponse {}
// DeleteDPURequest is used to delete already existing DPU in the infrastructure cluster
message DeleteDPURequest {
  // Name of the DPU to delete
  string name = 1;
}
// Keep empty for now, later on rpc may be extended
message DeleteDPUResponse {}
// GetDPURequest is used to get an existing DPU in the infrastructure cluster
message GetDPURequest {
  // name of the DPU to retrieve
  string name = 1;
}
// GetDPUResponse is a message containing the required DPU object
message GetDPUResponse {
  // contains a single DPU
  DPU dpu = 1;
}
// ListDPURequest is used to list existing DPU objects
message ListDPURequest {
  repeated Filter filters = 1;
}
// ListDPUResponse contains the list of DPUs requested with ListDPURequest
message ListDPUResponse {
  // list of DPUs
  repeated DPU dpus = 1;
}
// UpdateDPURequest is used to update an existing DPU in the infrastructure cluster
message UpdateDPURequest {
  // dpu object with fields to update
  DPU dpu = 1;
}
// Keep empty for now, later on rpc may be extended
message UpdateDPUResponse {}
// ----------
// Settings
// ----------
// CreateSettingsRequest is used to create a Settings in the infrastructure cluster
message CreateSettingsRequest {
  // full settings object
  Settings settings = 1;
}
// Keep empty for now, later on rpc may be extended
message CreateSettingsResponse {}
// DeleteSettingsRequest is used to delete already existing Settings in the infrastructure cluster
message DeleteSettingsRequest {
  // Name of the settings to delete
  string name = 1;
}
// Keep empty for now, later on rpc may be extended
message DeleteSettingsResponse {}
// GetSettingsRequest is used to get an existing Settings in the infrastructure cluster
message GetSettingsRequest {
  // name of the settings to retrieve
  string name = 1;
}
// GetSettingsResponse is a message containing the required Settings object
message GetSettingsResponse {
  // contains a single settings
  Settings settings = 1;
}
// ListSettingsRequest is used to list existing Settings objects
message ListSettingsRequest {
  repeated Filter filters = 1;
}
// ListSettingsResponse contains the list of Settings requested with ListSettingsRequest
message ListSettingsResponse {
  // list of settings
  repeated Settings settings = 1;
}
// ----------
// Rollout
// ----------
// CreateRolloutRequest is used to create a Rollout in the infrastructure cluster
message CreateRolloutRequest {
  // full rollout object
  Rollout rollout = 1;
}
// Keep empty for now, later on rpc may be extended
message CreateRolloutResponse {}
// DeleteRolloutRequest is used to delete already existing Rollout in the infrastructure cluster
message DeleteRolloutRequest {
  // Name of the rollout to delete
  string name = 1;
}
// Keep empty for now, later on rpc may be extended
message DeleteRolloutResponse {}
// GetRolloutRequest is used to get an existing Rollout in the infrastructure cluster
message GetRolloutRequest {
  // name of the rollout to retrieve
  string name = 1;
}
// GetRolloutResponse is a message containing the required Rollout object
message GetRolloutResponse {
  // contains a single rollout
  Rollout rollout = 1;
}
// ListRolloutRequest is used to list existing Rollout objects
message ListRolloutRequest {
  repeated Filter filters = 1;
}
// ListRolloutResponse contains the list of Rollout requested with ListRolloutRequest
message ListRolloutResponse {
  // list of rollouts
  repeated Rollout rollout = 1;
}
// UpdateRolloutRequest is used to update an existing Rollout in the infrastructure cluster
message UpdateRolloutRequest {
  // rollout object with fields to update
  Rollout rollout = 1;
}
// Keep empty for now, later on rpc may be extended
message UpdateRolloutResponse {}