Provisioning API - Overview
This page provides Provisioning API concepts along with an example.
Provisioning API provides a way to for the ClusterAdmin to trigger DPU provisioning in an infrastructure cluster.
Provisioning API is a set of CloudAdmin APIs.
CloudAdmin Provisioning API
- Provisioning GRPC API - API to provision the DPU in the infrastructure cluster 
The following infrastructure is used for the sake of this example.
Infrastructure Cluster
            
            ✓ icp> kubectl get node
NAME          STATUS   ROLES           AGE   VERSION
icp-master    Ready    control-plane   27h   v1.24.0
    
Universe Components
Universe components are deployed to infrastructure clusters by following the Deployment Guide.
The following lists the universe components in infrastructure cluster:
            
            ✓ icp> kubectl get po -n vault
NAME                                    READY   STATUS    RESTARTS   AGE
vault-0                                 1/1     Running   0          28h
vault-agent-injector-6fd8f84794-xqlg9   1/1     Running   0          21s
✓ icp> kubectl get po --all-namespaces --field-selector metadata.namespace!=kube-system
NAMESPACE                           NAME                                                              READY   STATUS    RESTARTS   AGE
capi-kubeadm-bootstrap-system       capi-kubeadm-bootstrap-controller-manager-677f784fb6-g64qm        1/1     Running   0          3h26m
capi-kubeadm-control-plane-system   capi-kubeadm-control-plane-controller-manager-7bf594b9c5-tsrcz    1/1     Running   0          3h26m
capi-system                         capi-controller-manager-6495b5bcd-5vcp4                           1/1     Running   0          3h26m
capm3-system                        capm3-controller-manager-547dd65854-4cgzq                         1/1     Running   0          3h26m
capm3-system                        ipam-controller-manager-7c85f789d-rt4m6                           1/1     Running   0          3h26m
cert-manager                        cert-manager-6dd9658548-5vp62                                     1/1     Running   0          3h26m
cert-manager                        cert-manager-cainjector-5987875fc7-rvcwg                          1/1     Running   0          3h26m
cert-manager                        cert-manager-webhook-7b4c5f579b-fvwzd                             1/1     Running   0          3h26m
universe                            icp-universe-infra-provisioning-baremetal-operator-5cc9bb6tcmv9   1/1     Running   0          3h3m
universe                            icp-universe-infra-provisioning-controller-8d47cd467-h87nb        1/1     Running   0          3h3m
universe                            icp-universe-infra-provisioning-bootp-66d9cc9964-x95pm            2/2     Running   0          3h3m
universe                            icp-universe-infra-provisioning-ironic-bb7776bfb-dcgbh            2/2     Running   0          3h3m
universe                            icp-universe-infra-provisioning-manager-c58ccc78b-jhs8x           1/1     Running   0          3h3m
universe                            icp-universe-infra-provisioning-mariadb-6c488ddc88-h6hwb          1/1     Running   0          3h3m
    
This section tests universe the provisioning API in the infrastructure cluster. The proto file and generated GO client for the API can be found in the universe-api repo (refer to the Manual GRPC API usage document before starting) and use ‘grpcurl’ tool to verify the provisioning API.
Create BMC Secret
            
            ✓ icp> cat << 'EOF' | tee cred.json
{
"cred":{
"name":"dpu-bmc-secret",
"user_name": "<user name of BMC>",
"password": "<password of BMC>"
}
}
EOF
✓ icp> grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local -d "$(cat cred.json | tr -d '\n')" \
       -proto universe/admin/provisioning/v1/provisioning.proto <infraprovisioning service ip:port> \
       universe.admin.provisioning.v1.UniverseProvisioningService.CreateCredential
    
Create DPU Settings
            
            ✓ icp> cat << EOF | tee settings.json
{
"settings":{
"linkType": "LINK_TYPE_ETH",
"name": dpu-settings",
"osImage": {
"url": "<the URL of OS images>",
"checksum": "<the URL of OS image's md5sum>",
"checksumType": "CHECKSUM_TYPE_MD5",
"diskFormat": "DISK_FORMAT_RAW"
},
}
}
EOF
✓ icp> grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local -d "$(cat settings.json | tr -d '\n')" \
       -proto universe/admin/provisioning/v1/provisioning.proto <infraprovisioning service ip:port> \
       universe.admin.provisioning.v1.UniverseProvisioningService.CreateSettings
    
Create Host
            
            cat << EOF | tee host.json
{
"host":{
"name":"dpu-host"
}
}
EOF
✓ icp> grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local -d "$(cat host.json | tr -d '\n')" \
       -proto universe/admin/provisioning/v1/provisioning.proto <infraprovisioning service ip:port> \
       universe.admin.provisioning.v1.UniverseProvisioningService.CreateHost
    
Provision DPU
            
            ✓ icp> cat << EOF | tee dpu.json
{
"dpu":{
"name":"dpu-1",
"bmc":{
"url":"dpu://<BMC ip address>",
"credential_ref":{
"name":"dpu-bmc-secret"
}
},
"boot_mac_address":"<DPU MAC address>",
"target_settings":{
"name":"dpu-settings"
},
"host_ref":{
"name": "dpu-host"
}
}
}
EOF
✓ icp> grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local -d "$(cat dpu.json | tr -d '\n')" \
       -proto universe/admin/provisioning/v1/provisioning.proto <infraprovisioning service ip:port> \
       universe.admin.provisioning.v1.UniverseProvisioningService.CreateDPU
    
DPU provisioning starts only if a “dpu.target_settings” is provided.
Check DPU Status
            
            ✓ icp> grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local -d '{"name": "dpu-1"}' \
       -proto universe/admin/provisioning/v1/provisioning.proto <infraprovisioning service ip:port> \
       universe.admin.provisioning.v1.UniverseProvisioningService.GetDPU
  {
    "dpu": {
      "name": "dpu-1",
      "hostRef": {
        "name": "dpu-host",
        "uid": ""
      },
      "bmc": {
        "url": "dpu://<BMC IP Address>",
        "credentialRef": {
          "name": "dpu-bmc-secret",
          "namespace": ""
        }
      },
      "bootMacAddress": "<DPU MAC Address>",
      "targetSettings": {
        "name": "dpu-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"
          }
        ]
      }
    }
  }
    
Once provisioning is done, the ‘dpu.status.conditions[type==Ready]’ is updated to ‘STATUS_TRUE’ and the ‘lastTransitionTime’ is populated with the completion time of the provisioning.
Timeout is not defined for provisioning duration by default. So in case any fauilre happened during the provisioning the ‘dpu.status.conditions[type==Ready]’ remains as ‘STATUS_FALSE’.
Check HOST Status
            
            ✓ icp> grpcurl -cacert=ca.crt -cert=admin.crt -key=admin.key -servername api-gateway.local -d '{"name": "hpc-cloud05"}' \
       -proto universe/admin/provisioning/v1/provisioning.proto <infraprovisioning service ip:port> \
       universe.admin.provisioning.v1.UniverseProvisioningService.GetHost
  {
    "host": {
      "name": "hpc-cloud05",
      "status": {
        "conditions": [
          {
            "type": "AdminActionsRequired",
            "status": "STATUS_TRUE",
            "lastTransitionTime": "2022-12-30 18:18:23 +0000 UTC",
            "reason": "FirmwareUpdated",
            "message": ""
          }
        ]
      }
    }
  }
    
Power cycle on the host server is needed to complete provisioning. Once provisioning is done, the ‘host.status.conditions[type==AdminActionsRequired]’ is set to ‘STATUS_TRUE’.