Skip to content

Commit

Permalink
kibana: add NewFleetServerHosts CreateFleetProxy to client
Browse files Browse the repository at this point in the history
  • Loading branch information
AndersonQ committed Oct 30, 2024
1 parent 9d6c29d commit a21b49e
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 9 deletions.
115 changes: 109 additions & 6 deletions kibana/fleet.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@ const (
fleetAgentsAPI = "/api/fleet/agents"
fleetAgentsDeleteAPI = "/api/fleet/agent_policies/delete"
fleetEnrollmentAPIKeysAPI = "/api/fleet/enrollment_api_keys" //nolint:gosec // no API key being leaked here
fleetFleetServerHostAPI = "/api/fleet/fleet_server_hosts/%s"
fleetFleetServerHostsAPI = "/api/fleet/fleet_server_hosts"
fleetPackagePoliciesAPI = "/api/fleet/package_policies"
fleetUnEnrollAgentAPI = "/api/fleet/agents/%s/unenroll"
fleetUninstallTokensAPI = "/api/fleet/uninstall_tokens" //nolint:gosec // NOT the "Potential hardcoded credentials"
fleetUpgradeAgentAPI = "/api/fleet/agents/%s/upgrade"
fleetAgentDownloadSourcesAPI = "/api/fleet/agent_download_sources"
fleetProxiesAPI = "/api/fleet/proxies"
)

//
Expand Down Expand Up @@ -474,21 +474,43 @@ func (client *Client) UpgradeAgent(ctx context.Context, request UpgradeAgentRequ
type FleetServerHost struct {
ID string `json:"id"`
Name string `json:"name"`
IsDefault bool `json:"is_default"`
HostURLs []string `json:"host_urls"`
IsDefault bool `json:"is_default"`
IsInternal bool `json:"is_internal"`
IsPreconfigured bool `json:"is_preconfigured"`
ProxyID string `json:"proxy_id"`
}

// ListFleetServerHostsRequest is currently unused
// ListFleetServerHostsRequest ...
type ListFleetServerHostsRequest struct {
// For future use
HostURLs []string `json:"host_urls"`
ID string `json:"id"`
IsDefault bool `json:"is_default"`
IsInternal bool `json:"is_internal"`
IsPreconfigured bool `json:"is_preconfigured"`
Name string `json:"name"`
ProxyID string `json:"proxy_id"`
}

// ListFleetServerHostsResponse is the JSON response for ListFleetServerHosts
type ListFleetServerHostsResponse struct {
Items []FleetServerHost `json:"items"`
}

// FleetServerHostsResponse is the json representation of the response from POST
// to fleetFleetServerHostsAPI
type FleetServerHostsResponse struct {
Item struct {
ID string `json:"id"`
HostUrls []string `json:"host_urls"`
IsDefault bool `json:"is_default"`
IsInternal bool `json:"is_internal"`
IsPreconfigured bool `json:"is_preconfigured"`
Name string `json:"name"`
ProxyID string `json:"proxy_id"`
} `json:"item"`
}

// ListFleetServerHosts returns a list of fleet server hosts
func (client *Client) ListFleetServerHosts(ctx context.Context, _ ListFleetServerHostsRequest) (r ListFleetServerHostsResponse, err error) {
resp, err := client.Connection.SendWithContext(ctx, http.MethodGet, fleetFleetServerHostsAPI, nil, nil, nil)
Expand All @@ -501,6 +523,33 @@ func (client *Client) ListFleetServerHosts(ctx context.Context, _ ListFleetServe

return r, err
}
func (client *Client) NewFleetServerHosts(ctx context.Context, req ListFleetServerHostsRequest) (FleetServerHostsResponse, error) {
bs, err := json.Marshal(req)
if err != nil {
return FleetServerHostsResponse{}, fmt.Errorf("could not marshal ListFleetServerHostsRequest")
}

resp, err := client.Connection.SendWithContext(ctx, http.MethodPost,
fleetFleetServerHostsAPI,
nil, nil, bytes.NewReader(bs))
if err != nil {
return FleetServerHostsResponse{}, fmt.Errorf("error calling new fleet server hosts API: %w", err)
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return FleetServerHostsResponse{}, fmt.Errorf("error reading fleet response: %w", err)
}

var fleetResp FleetServerHostsResponse
err = json.Unmarshal(body, &fleetResp)
if err != nil {
return FleetServerHostsResponse{}, fmt.Errorf("error parsing fleet response: %w", err)
}

return fleetResp, nil
}

//
// Get Fleet Server Host
Expand All @@ -516,7 +565,7 @@ type GetFleetServerHostResponse FleetServerHost

// GetFleetServerHost returns data on a fleet server
func (client *Client) GetFleetServerHost(ctx context.Context, request GetFleetServerHostRequest) (r GetFleetServerHostResponse, err error) {
apiURL := fmt.Sprintf(fleetFleetServerHostAPI, request.ID)
apiURL := fleetFleetServerHostsAPI + "/" + request.ID

resp, err := client.Connection.SendWithContext(ctx, http.MethodGet, apiURL, nil, nil, nil)
if err != nil {
Expand Down Expand Up @@ -628,6 +677,60 @@ func (client *Client) DeleteFleetPackage(ctx context.Context, packagePolicyID st
return r, err
}

//
// Fleet Proxies
//

type ProxiesRequest struct {
Certificate string `json:"certificate"`
CertificateAuthorities string `json:"certificate_authorities"`
CertificateKey string `json:"certificate_key"`
ID string `json:"id"`
IsPreconfigured bool `json:"is_preconfigured"`
Name string `json:"name"`
ProxyHeaders map[string]string `json:"proxy_headers"`
URL string `json:"url"`
}

type ProxiesResponse struct {
Item struct {
Certificate string `json:"certificate"`
CertificateAuthorities string `json:"certificate_authorities"`
CertificateKey string `json:"certificate_key"`
ID string `json:"id"`
IsPreconfigured bool `json:"is_preconfigured"`
Name string `json:"name"`
ProxyHeaders struct {
AdditionalProp1 string `json:"additionalProp1"`
AdditionalProp2 string `json:"additionalProp2"`
AdditionalProp3 string `json:"additionalProp3"`
} `json:"proxy_headers"`
URL string `json:"url"`
} `json:"item"`
}

// CreateFleetProxy creates a proxy
func (client *Client) CreateFleetProxy(ctx context.Context, req ProxiesRequest) (ProxiesResponse, error) {
bs, err := json.Marshal(req)
if err != nil {
return ProxiesResponse{}, fmt.Errorf("could not marshal ListFleetServerHostsRequest")
}

r, err := client.Connection.SendWithContext(ctx, http.MethodPost,
fleetProxiesAPI, nil, nil,
bytes.NewReader(bs),
)
if err != nil {
return ProxiesResponse{}, err
}

defer r.Body.Close()

resp := ProxiesResponse{}
err = readJSONResponse(r, &resp)
return resp, nil
}

// UninstallTokenResponse uninstall tokens response with resolved token values
type UninstallTokenResponse struct {
Items []UninstallTokenItem `json:"items"`
Expand All @@ -647,7 +750,7 @@ type uninstallTokenValueResponse struct {
Item UninstallTokenItem `json:"item"`
}

// GetPolicyUninstallTokens Retrieves the the policy uninstall tokens
// GetPolicyUninstallTokens Retrieves the policy uninstall tokens
func (client *Client) GetPolicyUninstallTokens(ctx context.Context, policyID string) (r UninstallTokenResponse, err error) {
// Fetch uninstall token for the policy
// /api/fleet/uninstall_tokens?policyId={policyId}&page=1&perPage=1000
Expand Down
6 changes: 3 additions & 3 deletions kibana/fleet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,8 @@ func TestFleetUpdatePolicy(t *testing.T) {
require.Equal(t, id, resp.ID)
require.Equal(t, policyName, resp.Name)
require.Equal(t, "default", resp.Namespace)
//require.Equal(t, "active", resp.Status)
//require.Equal(t, false, resp.IsManaged)
// require.Equal(t, "active", resp.Status)
// require.Equal(t, false, resp.IsManaged)
require.Equal(t, []MonitoringEnabledOption{MonitoringEnabledLogs, MonitoringEnabledMetrics}, resp.MonitoringEnabled)
require.Equal(t, agentFeatures, resp.AgentFeatures)
}
Expand Down Expand Up @@ -361,7 +361,7 @@ func TestFleetGetFleetServerHost(t *testing.T) {

handler := func(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case fmt.Sprintf(fleetFleetServerHostAPI, id):
case fleetFleetServerHostsAPI + "/" + id:
_, _ = w.Write(fleetGetFleetServerHostResponse)
}
}
Expand Down

0 comments on commit a21b49e

Please sign in to comment.