Skip to content
Open
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
50 changes: 50 additions & 0 deletions api/collectors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package api

type CreateCollectorRequest struct {
Collector CollectorCreateData `json:"collector"`
}

type CollectorListResponse struct {
Collectors []CollectorData `json:"collectors"`
}

type CollectorResponse struct{
Collector CollectorData `json:"collector"`
}

type linkData struct {
Rel string `json:"rel"`
Href string `json:"href"`
}

type CollectorData struct {
Id int64 `json:"id"`
Name string `json:"name"`
CollectorType string `json:"collectorType"`
Alive bool `json:"alive"`
Links []linkData `json:"links,omitempty"`
CollectorVersion string `json:"collectorVersion"`
Ephemeral bool `json:"ephemeral"`
Description string `json:"description,omitempty"`
OsName string `json:"osName,omitempty"`
OsArch string `json:"osArch,omitempty"`
OsVersion string `json:"osVersion,omitempty"`
Category string `json:"category,omitempty"`
CutoffRelativeTime string `json:"cutoffRelativeTime,omitempty"`
CutoffTimestamp int64 `json:"cutoffTimestamp,omitempty"`
HostName string `json:"hostName,omitempty"`
LastSeenAlive int64 `json:"lastSeenAlive,omitempty"`
SourceSyncMode string `json:"sourceSyncMode,omitempty"`
TimeZone string `json:"timeZone,omitempty"`
TargetCpu int64 `json:"targetCpu,omitempty"`
Fields string `json:"fields,omitempty"`
}

type CollectorCreateData struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
CollectorType string `json:"collectorType"`
Category string `json:"category,omitempty"`
HostName string `json:"hostName,omitempty"`
Fields string `json:"fields,omitempty"`
}
24 changes: 24 additions & 0 deletions pkg/cmd/collectors/collectors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package collectors

import (
"github.com/spf13/cobra"
cmdCollectorCreate "github.com/wizedkyle/sumocli/pkg/cmd/collectors/create"
cmdCollectorDelete "github.com/wizedkyle/sumocli/pkg/cmd/collectors/delete"
cmdCollectorGet "github.com/wizedkyle/sumocli/pkg/cmd/collectors/get"
cmdCollectorsList "github.com/wizedkyle/sumocli/pkg/cmd/collectors/list"
)

func NewCmdCollector() *cobra.Command {
cmd := &cobra.Command{
Use: "collectors <command>",
Short: "Manage collectors",
Long: "Work with Sumo Logic collectors",
}

cmd.AddCommand(cmdCollectorsList.NewCmdCollectorsList())
cmd.AddCommand(cmdCollectorGet.NewCmdCollectorGet())
cmd.AddCommand(cmdCollectorCreate.NewCmdCollectorCreate())
cmd.AddCommand(cmdCollectorDelete.NewCmdCollectorDelete())

return cmd
}
71 changes: 71 additions & 0 deletions pkg/cmd/collectors/create/create.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package create

import (
"encoding/json"
"fmt"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
"github.com/wizedkyle/sumocli/api"
"github.com/wizedkyle/sumocli/pkg/cmd/factory"
"github.com/wizedkyle/sumocli/pkg/guard"
"github.com/wizedkyle/sumocli/pkg/logging"
"io/ioutil"
)

func NewCmdCollectorCreate() *cobra.Command {
var (
name string
description string
category string
hostName string
)
cmd := &cobra.Command{
Use: "create",
Short: "Creates a Sumo Logic hosted collector",
Run: func(cmd *cobra.Command, args []string) {
logger := logging.GetLoggerForCommand(cmd)
logger.Debug().Msg("Collector create request started.")
createCollector(name, description, "Hosted", category, hostName, logger)
logger.Debug().Msg("Collector create request finished.")
},
}

cmd.Flags().StringVar(&name, "name", "", "Name of the collector")
cmd.Flags().StringVar(&description, "description", "", "Description for the collector")
cmd.Flags().StringVar(&category, "category", "", "Category of the collector")
cmd.Flags().StringVar(&hostName, "hostName", "", "HostName of the collector")

return cmd
}

func createCollector(name string, description string, collectorType string, category string, hostName string, logger zerolog.Logger) {
var createCollectorResponse api.CollectorData
guard.MustNotBeEmpty(name, "--name field needs to be specified.")
guard.MustNotBeEmpty(description, "--description field needs to be specified.")

requestBodySchema := &api.CreateCollectorRequest{
Collector: api.CollectorCreateData{
Name: name,
Description: description,
CollectorType: collectorType,
Category: category,
HostName: hostName,
},
}

requestBody, _ := json.Marshal(requestBodySchema)
client, request := factory.NewHttpRequestWithBody("POST", "v1/collectors", requestBody)
response, err := client.Do(request)
logging.LogError(err, logger)

defer response.Body.Close()
responseBody, err := ioutil.ReadAll(response.Body)

if response.StatusCode != 200 {
factory.HttpError(response.StatusCode, responseBody, logger)
} else {
jsonErr := json.Unmarshal(responseBody, &createCollectorResponse)
logging.LogError(jsonErr, logger)
fmt.Println(createCollectorResponse.Name + " collector successfully created")
}
}
53 changes: 53 additions & 0 deletions pkg/cmd/collectors/delete/delete.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package delete

import (
"encoding/json"
"fmt"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
"github.com/wizedkyle/sumocli/api"
"github.com/wizedkyle/sumocli/pkg/cmd/factory"
"github.com/wizedkyle/sumocli/pkg/guard"
"github.com/wizedkyle/sumocli/pkg/logging"
"io/ioutil"
)

func NewCmdCollectorDelete() *cobra.Command {
var (
id string
)
cmd := &cobra.Command{
Use: "delete",
Short: "Deletes a Sumo Logic hosted collector",
Run: func(cmd *cobra.Command, args []string) {
logger := logging.GetLoggerForCommand(cmd)
logger.Debug().Msg("Collector delete request started.")
deleteCollector(id, logger)
logger.Debug().Msg("Collector delete request finished.")
},
}

cmd.Flags().StringVar(&id, "id", "", "Id of the collector")

return cmd
}

func deleteCollector(id string, logger zerolog.Logger) {
var createCollectorResponse api.CollectorData
guard.MustNotBeEmpty(id, "--id field needs to be specified.")

client, request := factory.NewHttpRequest("DELETE", "v1/collectors/" + id)
response, err := client.Do(request)
logging.LogError(err, logger)

defer response.Body.Close()
responseBody, err := ioutil.ReadAll(response.Body)

if response.StatusCode != 200 {
factory.HttpError(response.StatusCode, responseBody, logger)
} else {
jsonErr := json.Unmarshal(responseBody, &createCollectorResponse)
logging.LogError(jsonErr, logger)
fmt.Println(createCollectorResponse.Name + " collector successfully deleted")
}
}
127 changes: 127 additions & 0 deletions pkg/cmd/collectors/get/get.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package get

import (
"encoding/json"
"fmt"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
"github.com/tidwall/gjson"
"github.com/wizedkyle/sumocli/api"
"github.com/wizedkyle/sumocli/pkg/cmd/factory"
"github.com/wizedkyle/sumocli/pkg/logging"
"io/ioutil"
"os"
"strings"
)

func NewCmdCollectorGet() *cobra.Command {
var (
id string
name string
output string
)

cmd := &cobra.Command{
Use: "get",
Short: "Gets a Sumo Logic collector",
Long: `The following fields can be exported using the --output command:
name
description
filterPredicate
users
capabilities
id
`,
Run: func(cmd *cobra.Command, args []string) {
logger := logging.GetLoggerForCommand(cmd)
logger.Debug().Msg("CollectorListResponse get request started.")
if id == "" {
if name != "" {
getCollectorByName(name, output, logger)
}
} else {
getCollector(id, output, logger)
}
logger.Debug().Msg("CollectorListResponse get request finished.")
},
}

cmd.Flags().StringVar(&id, "id", "", "Specify the id of the collector to get")
cmd.Flags().StringVar(&name, "name", "", "Specify the name of the collector to get")
cmd.Flags().StringVar(&output, "output", "", "Specify the field to export the value from")

return cmd
}

func getCollectorByName(name string, output string, logger zerolog.Logger) {
var collectorResource api.CollectorResponse

requestUrl := "v1/collectors/name/" + name
client, request := factory.NewHttpRequest("GET", requestUrl)
response, err := client.Do(request)
logging.LogError(err, logger)

defer response.Body.Close()
responseBody, err := ioutil.ReadAll(response.Body)
logging.LogError(err, logger)

jsonErr := json.Unmarshal(responseBody, &collectorResource)
logging.LogError(jsonErr, logger)

collectorInfoJson, err := json.MarshalIndent(collectorResource, "", " ")
logging.LogError(err, logger)

if validateOutput(output) == true {
value := gjson.Get(string(collectorInfoJson), output)
formattedValue := strings.Trim(value.String(), `"[]"`)
fmt.Println(formattedValue)
} else {
fmt.Println(string(collectorInfoJson))
}
}

func getCollector(id string, output string, logger zerolog.Logger) {
var collectorResource api.CollectorResponse

if id == "" {
fmt.Println("--id field needs to be specified.")
os.Exit(0)
}

requestUrl := "v1/collectors/" + id
client, request := factory.NewHttpRequest("GET", requestUrl)
response, err := client.Do(request)
logging.LogError(err, logger)

defer response.Body.Close()
responseBody, err := ioutil.ReadAll(response.Body)
logging.LogError(err, logger)

jsonErr := json.Unmarshal(responseBody, &collectorResource)
logging.LogError(jsonErr, logger)

collectorInfoJson, err := json.MarshalIndent(collectorResource, "", " ")
logging.LogError(err, logger)

if validateOutput(output) == true {
value := gjson.Get(string(collectorInfoJson), output)
formattedValue := strings.Trim(value.String(), `"[]"`)
fmt.Println(formattedValue)
} else {
fmt.Println(string(collectorInfoJson))
}
}

func validateOutput(output string) bool {
switch output {
case
"name",
"description",
"filterPredicate",
"users",
"capabilities",
"id":
return true
}
return false
}
Loading