mirror of
https://github.com/fleetdm/fleet
synced 2026-04-21 21:47:20 +00:00
This project adds support for terraforming teams in Fleet. If you have 100+ teams, managing them is is prone to error, mistakes, lost configuration, and general pain. An industry standard tool like terraform can unify this configuration as code. In order to do this, I wrote a terraform provider that on one end talks to the Fleet api, and on the other end implements an interface for terraform. More information is in the README. A small sample `main.tf` file is supplied. --------- Co-authored-by: Brock Walters <153771548+nonpunctual@users.noreply.github.com>
93 lines
3.2 KiB
Go
93 lines
3.2 KiB
Go
package fleetdm_client
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/stretchr/testify/require"
|
|
"math/rand"
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
var letters = []rune("abcdefghijklmnopqrstuvwxyz")
|
|
var defaultDescription = "Awesome description"
|
|
var defaultAgentOptions = `{"config":{"decorators":{"load":["SELECT uuid AS host_uuid FROM system_info;","SELECT hostname AS hostname FROM system_info;"]},"options":{"disable_distributed":false,"distributed_interval":10,"distributed_plugin":"tls","distributed_tls_max_attempts":3,"logger_tls_endpoint":"/api/osquery/log","logger_tls_period":10,"pack_delimiter":"/"}},"overrides":{}}`
|
|
|
|
func randTeam() string {
|
|
b := make([]rune, 6)
|
|
for i := range b {
|
|
b[i] = letters[rand.Intn(len(letters))]
|
|
}
|
|
return "aaa-" + string(b)
|
|
}
|
|
|
|
func TestBasic(t *testing.T) {
|
|
apiKey := os.Getenv("FLEETDM_APIKEY")
|
|
if apiKey == "" {
|
|
t.Skip("FLEETDM_APIKEY not set")
|
|
}
|
|
apiURL := os.Getenv("FLEETDM_URL")
|
|
if apiURL == "" {
|
|
t.Skip("FLEETDM_URL not set")
|
|
}
|
|
client := NewFleetDMClient(apiURL, apiKey)
|
|
require.NotNil(t, client)
|
|
|
|
// Create a nice default team
|
|
teamName := randTeam()
|
|
team, err := client.CreateTeam(teamName, defaultDescription)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, team)
|
|
require.Equal(t, teamName, team.Team.Name)
|
|
require.Equal(t, defaultDescription, team.Team.Description)
|
|
aoBytes, err := json.Marshal(team.Team.AgentOptions)
|
|
require.NoError(t, err)
|
|
require.Equal(t, defaultAgentOptions, string(aoBytes))
|
|
|
|
// And verify we can get that team back
|
|
teamGotten, err := client.GetTeam(team.Team.ID)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, teamGotten)
|
|
require.Equal(t, team.Team.ID, teamGotten.Team.ID)
|
|
require.Equal(t, team.Team.Name, teamGotten.Team.Name)
|
|
require.Equal(t, teamName, teamGotten.Team.Name)
|
|
require.Equal(t, defaultDescription, teamGotten.Team.Description)
|
|
aoBytes, err = json.Marshal(teamGotten.Team.AgentOptions)
|
|
require.NoError(t, err)
|
|
require.Equal(t, defaultAgentOptions, string(aoBytes))
|
|
|
|
// Set different agent options
|
|
newAO := `{"command_line_flags":{"disable_events":true},"config":{"options":{"logger_tls_endpoint":"/test"}},"overrides":{}}`
|
|
teamAO, err := client.UpdateAgentOptions(team.Team.ID, newAO)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, teamAO)
|
|
require.Equal(t, team.Team.ID, teamAO.Team.ID)
|
|
aoBytes, err = json.Marshal(teamAO.Team.AgentOptions)
|
|
require.NoError(t, err)
|
|
require.Equal(t, newAO, string(aoBytes))
|
|
|
|
// Set a different description and different name
|
|
newName := randTeam()
|
|
newDescription := "New description"
|
|
teamUp, err := client.UpdateTeam(team.Team.ID, &newName, &newDescription)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, teamUp)
|
|
require.Equal(t, team.Team.ID, teamUp.Team.ID)
|
|
require.Equal(t, newName, teamUp.Team.Name)
|
|
require.Equal(t, newDescription, teamUp.Team.Description)
|
|
|
|
// Lookup the team based on the new name
|
|
teamId, err := client.TeamNameToID(newName)
|
|
require.NoError(t, err)
|
|
require.NotEqual(t, 0, teamId)
|
|
require.Equal(t, teamUp.Team.ID, teamId)
|
|
require.Equal(t, newName, teamUp.Team.Name)
|
|
|
|
// And finally, delete the team
|
|
err = client.DeleteTeam(team.Team.ID)
|
|
require.NoError(t, err)
|
|
|
|
// And verify it's gone
|
|
teamDNE, err := client.GetTeam(team.Team.ID)
|
|
require.Error(t, err)
|
|
require.Nil(t, teamDNE)
|
|
}
|