Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring handlers go #581

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 154 additions & 0 deletions api/agent/cluster_handlers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
package api

import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
)

func (s *Server) clusterList(w http.ResponseWriter, r *http.Request) {
var input ListClustersRequest
buf := new(strings.Builder)

n, err := io.Copy(buf, r.Body)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
data := buf.String()

if n == 0 {
input = ListClustersRequest{}
} else {
err := json.Unmarshal([]byte(data), &input)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
}

ret, err := s.ListClusters(input)
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
cors(w, r)
je := json.NewEncoder(w)
err = je.Encode(ret)
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
}

func (s *Server) clusterCreate(w http.ResponseWriter, r *http.Request) {
buf := new(strings.Builder)
n, err := io.Copy(buf, r.Body)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
data := buf.String()
var input RegisterClusterRequest
if n == 0 {
input = RegisterClusterRequest{}
} else {
err := json.Unmarshal([]byte(data), &input)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
}
err = s.DefineCluster(input)
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
cors(w, r)
_, err = w.Write([]byte("SUCCESS"))
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
}

func (s *Server) clusterEdit(w http.ResponseWriter, r *http.Request) {
buf := new(strings.Builder)
n, err := io.Copy(buf, r.Body)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
data := buf.String()
var input EditClusterRequest
if n == 0 {
input = EditClusterRequest{}
} else {
err := json.Unmarshal([]byte(data), &input)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
}
err = s.EditCluster(input)
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
cors(w, r)
_, err = w.Write([]byte("SUCCESS"))
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
}

func (s *Server) clusterDelete(w http.ResponseWriter, r *http.Request) {
buf := new(strings.Builder)
n, err := io.Copy(buf, r.Body)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
data := buf.String()
var input DeleteClusterRequest
if n == 0 {
input = DeleteClusterRequest{}
} else {
err := json.Unmarshal([]byte(data), &input)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
}
err = s.DeleteCluster(input)
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
cors(w, r)
_, err = w.Write([]byte("SUCCESS"))
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}

}
196 changes: 86 additions & 110 deletions api/agent/crd_handlers.go
Original file line number Diff line number Diff line change
@@ -1,110 +1,86 @@
package api

import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
"google.golang.org/protobuf/encoding/protojson"

crdmanager "github.com/spiffe/tornjak/pkg/agent/spirecrd"
trustdomain "github.com/spiffe/spire-api-sdk/proto/spire/api/server/trustdomain/v1"
)

func (s *Server) CRDFederationList(w http.ResponseWriter, r *http.Request) {
// if CRD management not configured
if s.CRDManager == nil {
emsg := "Error: CRD Manager not configured on Tornjak."
retError(w, emsg, http.StatusBadRequest)
return
}
// if CRD management is configured
var input crdmanager.ListFederationRelationshipsRequest
buf := new(strings.Builder)

n, err := io.Copy(buf, r.Body)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
data := buf.String()

if n == 0 {
input = crdmanager.ListFederationRelationshipsRequest{}
} else {
err := json.Unmarshal([]byte(data), &input)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
}

ret, err := s.CRDManager.ListClusterFederatedTrustDomains(input) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusInternalServerError)
return
}

cors(w, r)
je := json.NewEncoder(w)
err = je.Encode(ret) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}

}

func (s *Server) CRDFederationCreate(w http.ResponseWriter, r *http.Request) {
if s.CRDManager == nil {
emsg := "Error: CRD Manager not configured on Tornjak."
retError(w, emsg, http.StatusBadRequest)
return
}
var input crdmanager.BatchCreateFederationRelationshipsRequest
var rawInput trustdomain.BatchCreateFederationRelationshipRequest
buf := new(strings.Builder)

n, err := io.Copy(buf, r.Body)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
data := buf.String()

if n == 0 {
input = crdmanager.BatchCreateFederationRelationshipsRequest{}
} else {
// required to use protojson because of oneof field
err := protojson.Unmarshal([]byte(data), &rawInput)
if err != nil {
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
input = crdmanager.BatchCreateFederationRelationshipsRequest(rawInput) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet
}

ret, err := s.CRDManager.BatchCreateClusterFederatedTrustDomains(input) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet
if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusInternalServerError)
return
}

cors(w, r)
je := json.NewEncoder(w)
err = je.Encode(ret) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet

if err != nil {
emsg := fmt.Sprintf("Error: %v", err.Error())
retError(w, emsg, http.StatusBadRequest)
return
}
}
package api

import (
"encoding/json"
"net/http"
"strings"
"google.golang.org/protobuf/encoding/protojson"

crdmanager "github.com/spiffe/tornjak/pkg/agent/spirecrd"
trustdomain "github.com/spiffe/spire-api-sdk/proto/spire/api/server/trustdomain/v1"
)

func (s *Server) CRDFederationList(w http.ResponseWriter, r *http.Request) {
// if CRD management not configured
if s.CRDManager == nil {
emsg := "Error: CRD Manager not configured on Tornjak."
retError(w, emsg, http.StatusBadRequest)
return
}
// if CRD management is configured
var input crdmanager.ListFederationRelationshipsRequest
buf := new(strings.Builder)

n, err, data := copyIntoBuff(buf, w, r, "Error parsing data: ")
if n == 0 && data == "err" { return }

if n == 0 {
input = crdmanager.ListFederationRelationshipsRequest{}
} else {
err := json.Unmarshal([]byte(data), &input)
if isHttpError(err, w, "Error parsing data: ", http.StatusBadRequest) {
return
}
}

ret, err := s.CRDManager.ListClusterFederatedTrustDomains(input) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet
if isHttpError(err, w, "Error: ", http.StatusInternalServerError) {
return
}

cors(w, r)
je := json.NewEncoder(w)
err = je.Encode(ret) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet

if isHttpError(err, w, "Error: ", http.StatusBadRequest) {
return
}
}

func (s *Server) CRDFederationCreate(w http.ResponseWriter, r *http.Request) {
if s.CRDManager == nil {
emsg := "Error: CRD Manager not configured on Tornjak."
retError(w, emsg, http.StatusBadRequest)
return
}
var input crdmanager.BatchCreateFederationRelationshipsRequest
var rawInput trustdomain.BatchCreateFederationRelationshipRequest
buf := new(strings.Builder)

n, err, data := copyIntoBuff(buf, w, r, "Error parsing data: ")
if n == 0 && data == "err" { return }

if n == 0 {
input = crdmanager.BatchCreateFederationRelationshipsRequest{}
} else {
// required to use protojson because of oneof field
err := protojson.Unmarshal([]byte(data), &rawInput)
if isHttpError(err, w, "Error parsing data: ", http.StatusBadRequest) {
return
}
input = crdmanager.BatchCreateFederationRelationshipsRequest(rawInput) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet
}

ret, err := s.CRDManager.BatchCreateClusterFederatedTrustDomains(input) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet
if isHttpError(err, w, "Error: ", http.StatusInternalServerError) {
return
}

cors(w, r)
je := json.NewEncoder(w)
err = je.Encode(ret) //nolint:govet //Ignoring mutex (not being used) - sync.Mutex by value is unused for linter govet

if isHttpError(err, w, "Error: ", http.StatusBadRequest) {
return
}
}
Loading