package services import ( "net/http" api "edge-infra.dev/pkg/edge/device-registrar/api/v1alpha1" "edge-infra.dev/pkg/edge/device-registrar/config" "github.com/gin-gonic/gin" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // DevicePairResponse represents the response after pairing a device // swagger:model DevicePairResponse type DevicePairResponse struct { // example: https://edge-bootstrap.store.ncr.corp/connect/F7RAXZXBFZQRPAU ConnectURL string `json:"connectURL"` HostMapping HostMapping `json:"hostMapping"` } // swagger:route POST /pair core pair // Initiates a paring process // // Initiates a paring process and returns a URL with an activation code for device to connect // responses: // // 200: DevicePairResponse Success // 500: description:Internal Server Error // // Pair initiates the pairing process for a device func Pair(c *gin.Context) { // step 1: create ActivationCode // Generate new activation code ac, err := generateActivationCode() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to create activation code: " + err.Error()}) return } // step 2: create DeviceBinding deviceBinding := &api.DeviceBinding{ ObjectMeta: metav1.ObjectMeta{ GenerateName: "pair-", Namespace: config.Namespace, }, } k8sClient, ctx, cancel := config.GetClientandContext(c) defer cancel() if err := k8sClient.Create(ctx, deviceBinding); err != nil && !k8serrors.IsAlreadyExists(err) { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to create device binding: " + err.Error()}) return } deviceBinding.Status.ActivationCode = ac.Plain() deviceBinding.Status.Timestamp = metav1.Now() deviceBinding.Status.CodeUsed = false err = k8sClient.Status().Update(ctx, deviceBinding) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to update deviceBinding status: " + err.Error()}) return } vip, err := config.GetVIP(ctx, k8sClient) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to retrieve VIP address: " + err.Error()}) return } resp := DevicePairResponse{ ConnectURL: config.ConnectURL + "/" + deviceBinding.Status.ActivationCode, HostMapping: HostMapping{ Host: config.BootstrapHost, VIP: vip, }, } c.JSON(http.StatusOK, resp) }