Files
zrok/controller/createIdentity.go

87 lines
2.4 KiB
Go

package controller
import (
"bytes"
"encoding/json"
"fmt"
"github.com/go-openapi/runtime/middleware"
"github.com/michaelquigley/df/dl"
rest_model_edge "github.com/openziti/edge-api/rest_model"
"github.com/openziti/zrok/v2/controller/automation"
"github.com/openziti/zrok/v2/rest_model_zrok"
"github.com/openziti/zrok/v2/rest_server_zrok/operations/admin"
)
type createIdentityHandler struct{}
func newCreateIdentityHandler() *createIdentityHandler {
return &createIdentityHandler{}
}
func (h *createIdentityHandler) Handle(params admin.CreateIdentityParams, principal *rest_model_zrok.Principal) middleware.Responder {
name := params.Body.Name
if !principal.Admin {
dl.Errorf("invalid admin principal")
return admin.NewCreateIdentityUnauthorized()
}
ziti, err := automation.NewZitiAutomation(cfg.Ziti)
if err != nil {
dl.Errorf("error getting automation client: %v", err)
return admin.NewCreateIdentityInternalServerError()
}
// create identity
identityOpts := &automation.IdentityOptions{
BaseOptions: automation.BaseOptions{
Name: name,
Tags: automation.ZrokTags(),
},
Type: rest_model_edge.IdentityTypeService,
IsAdmin: false,
}
zId, err := ziti.Identities.Create(identityOpts)
if err != nil {
dl.Errorf("error creating identity: %v", err)
return admin.NewCreateIdentityInternalServerError()
}
// enroll identity
idCfg, err := ziti.Identities.Enroll(zId)
if err != nil {
dl.Errorf("error enrolling identity: %v", err)
return admin.NewCreateIdentityInternalServerError()
}
// create edge router policy for the identity
erpOpts := &automation.EdgeRouterPolicyOptions{
BaseOptions: automation.BaseOptions{
Name: zId,
Tags: automation.ZrokTags(),
},
IdentityRoles: []string{fmt.Sprintf("@%v", zId)},
EdgeRouterRoles: []string{"#all"},
Semantic: rest_model_edge.SemanticAllOf,
}
if _, err := ziti.EdgeRouterPolicies.Create(erpOpts); err != nil {
dl.Errorf("error creating edge router policy for identity: %v", err)
return admin.NewCreateIdentityInternalServerError()
}
var out bytes.Buffer
enc := json.NewEncoder(&out)
enc.SetEscapeHTML(false)
err = enc.Encode(&idCfg)
if err != nil {
dl.Errorf("error encoding identity config: %v", err)
return admin.NewCreateIdentityInternalServerError()
}
return admin.NewCreateIdentityCreated().WithPayload(&admin.CreateIdentityCreatedBody{
Identity: zId,
Cfg: out.String(),
})
}