mirror of
https://github.com/fleetdm/fleet
synced 2026-05-23 08:58:41 +00:00
parent
04712c0426
commit
9ade086448
8 changed files with 61 additions and 2 deletions
|
|
@ -97,7 +97,7 @@ var TestFunctions = [...]func(*testing.T, kolide.Datastore){
|
|||
testCarveListCarves,
|
||||
testCarveCleanupCarves,
|
||||
testCarveUpdateCarve,
|
||||
testTeamGetSet,
|
||||
testTeamGetSetDelete,
|
||||
testUserTeams,
|
||||
testUserCreateWithTeams,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import (
|
|||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func testTeamGetSet(t *testing.T, ds kolide.Datastore) {
|
||||
func testTeamGetSetDelete(t *testing.T, ds kolide.Datastore) {
|
||||
var createTests = []struct {
|
||||
name, description string
|
||||
}{
|
||||
|
|
@ -34,6 +34,12 @@ func testTeamGetSet(t *testing.T, ds kolide.Datastore) {
|
|||
require.NoError(t, err)
|
||||
assert.Equal(t, tt.name, team.Name)
|
||||
assert.Equal(t, tt.description, team.Description)
|
||||
|
||||
err = ds.DeleteTeam(team.ID)
|
||||
require.NoError(t, err)
|
||||
|
||||
team, err = ds.TeamByName(tt.name)
|
||||
require.Error(t, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,13 @@ func (d *Datastore) Team(tid uint) (*kolide.Team, error) {
|
|||
return team, nil
|
||||
}
|
||||
|
||||
func (d *Datastore) DeleteTeam(tid uint) error {
|
||||
if err := d.deleteEntity("teams", tid); err != nil {
|
||||
return errors.Wrapf(err, "delete team id %d", tid)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Datastore) TeamByName(name string) (*kolide.Team, error) {
|
||||
sql := `
|
||||
SELECT * FROM teams
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ type TeamStore interface {
|
|||
NewTeam(team *Team) (*Team, error)
|
||||
// Team retrieves the Team by ID.
|
||||
Team(tid uint) (*Team, error)
|
||||
// Team deletes the Team by ID.
|
||||
DeleteTeam(tid uint) error
|
||||
// TeamByName retrieves the Team by Name.
|
||||
TeamByName(name string) (*Team, error)
|
||||
// SaveTeam saves any changes to the team.
|
||||
|
|
@ -24,6 +26,8 @@ type TeamService interface {
|
|||
NewTeam(ctx context.Context, p TeamPayload) (*Team, error)
|
||||
// ModifyTeam modifies an existing team.
|
||||
ModifyTeam(ctx context.Context, id uint, payload TeamPayload) (*Team, error)
|
||||
// DeleteTeam deletes an existing team.
|
||||
DeleteTeam(ctx context.Context, id uint) error
|
||||
// ListTeams lists teams with the ordering and filters in the provided
|
||||
// options.
|
||||
ListTeams(ctx context.Context, opt ListOptions) ([]*Team, error)
|
||||
|
|
|
|||
|
|
@ -93,3 +93,28 @@ func makeListTeamsEndpoint(svc kolide.Service) endpoint.Endpoint {
|
|||
return resp, nil
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Delete Team
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
type deleteTeamRequest struct {
|
||||
ID uint `json:"id"`
|
||||
}
|
||||
|
||||
type deleteTeamResponse struct {
|
||||
Err error `json:"error,omitempty"`
|
||||
}
|
||||
|
||||
func (r deleteTeamResponse) error() error { return r.Err }
|
||||
|
||||
func makeDeleteTeamEndpoint(svc kolide.Service) endpoint.Endpoint {
|
||||
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||
req := request.(deleteTeamRequest)
|
||||
err := svc.DeleteTeam(ctx, req.ID)
|
||||
if err != nil {
|
||||
return deleteTeamResponse{Err: err}, nil
|
||||
}
|
||||
return deleteTeamResponse{}, nil
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ type KolideEndpoints struct {
|
|||
Version endpoint.Endpoint
|
||||
CreateTeam endpoint.Endpoint
|
||||
ModifyTeam endpoint.Endpoint
|
||||
DeleteTeam endpoint.Endpoint
|
||||
ListTeams endpoint.Endpoint
|
||||
}
|
||||
|
||||
|
|
@ -218,6 +219,7 @@ func MakeKolideServerEndpoints(svc kolide.Service, jwtKey, urlPrefix string, lim
|
|||
// TODO permissions for teams endpoints
|
||||
CreateTeam: authenticatedUser(jwtKey, svc, makeCreateTeamEndpoint(svc)),
|
||||
ModifyTeam: authenticatedUser(jwtKey, svc, makeModifyTeamEndpoint(svc)),
|
||||
DeleteTeam: authenticatedUser(jwtKey, svc, makeDeleteTeamEndpoint(svc)),
|
||||
ListTeams: authenticatedUser(jwtKey, svc, makeListTeamsEndpoint(svc)),
|
||||
|
||||
// Authenticated status endpoints
|
||||
|
|
@ -330,6 +332,7 @@ type kolideHandlers struct {
|
|||
Version http.Handler
|
||||
CreateTeam http.Handler
|
||||
ModifyTeam http.Handler
|
||||
DeleteTeam http.Handler
|
||||
ListTeams http.Handler
|
||||
}
|
||||
|
||||
|
|
@ -429,6 +432,7 @@ func makeKolideKitHandlers(e KolideEndpoints, opts []kithttp.ServerOption) *koli
|
|||
Version: newServer(e.Version, decodeNoParamsRequest),
|
||||
CreateTeam: newServer(e.CreateTeam, decodeCreateTeamRequest),
|
||||
ModifyTeam: newServer(e.ModifyTeam, decodeModifyTeamRequest),
|
||||
DeleteTeam: newServer(e.DeleteTeam, decodeDeleteTeamRequest),
|
||||
ListTeams: newServer(e.ListTeams, decodeListTeamsRequest),
|
||||
}
|
||||
}
|
||||
|
|
@ -645,6 +649,7 @@ func attachKolideAPIRoutes(r *mux.Router, h *kolideHandlers) {
|
|||
r.Handle("/api/v1/fleet/teams", h.CreateTeam).Methods("POST").Name("create_team")
|
||||
r.Handle("/api/v1/fleet/teams", h.ListTeams).Methods("GET").Name("list_teams")
|
||||
r.Handle("/api/v1/fleet/teams/{id}", h.ModifyTeam).Methods("PATCH").Name("modify_team")
|
||||
r.Handle("/api/v1/fleet/teams/{id}", h.DeleteTeam).Methods("DELETE").Name("delete_team")
|
||||
|
||||
r.Handle("/api/v1/osquery/enroll", h.EnrollAgent).Methods("POST").Name("enroll_agent")
|
||||
r.Handle("/api/v1/osquery/config", h.GetClientConfig).Methods("POST").Name("get_client_config")
|
||||
|
|
|
|||
|
|
@ -49,3 +49,7 @@ func (svc service) ModifyTeam(ctx context.Context, id uint, payload kolide.TeamP
|
|||
func (svc service) ListTeams(ctx context.Context, opt kolide.ListOptions) ([]*kolide.Team, error) {
|
||||
return svc.ds.ListTeams(opt)
|
||||
}
|
||||
|
||||
func (svc service) DeleteTeam(ctx context.Context, tid uint) error {
|
||||
return svc.ds.DeleteTeam(tid)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,3 +35,11 @@ func decodeListTeamsRequest(ctx context.Context, r *http.Request) (interface{},
|
|||
}
|
||||
return listTeamsRequest{ListOptions: opt}, nil
|
||||
}
|
||||
|
||||
func decodeDeleteTeamRequest(ctx context.Context, r *http.Request) (interface{}, error) {
|
||||
id, err := idFromRequest(r, "id")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return deleteTeamRequest{ID: id}, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue