Skip to content
Merged
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
9 changes: 4 additions & 5 deletions cmd/benchmark.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (

"github.com/elastic/elastic-package/internal/corpusgenerator"
"github.com/elastic/elastic-package/internal/install"
"github.com/elastic/elastic-package/internal/kibana"
"github.com/elastic/elastic-package/internal/stack"

"github.com/spf13/cobra"

Expand All @@ -25,7 +25,6 @@ import (
"github.com/elastic/elastic-package/internal/benchrunner/runners/system"
"github.com/elastic/elastic-package/internal/cobraext"
"github.com/elastic/elastic-package/internal/common"
"github.com/elastic/elastic-package/internal/elasticsearch"
"github.com/elastic/elastic-package/internal/packages"
"github.com/elastic/elastic-package/internal/signal"
"github.com/elastic/elastic-package/internal/testrunner"
Expand Down Expand Up @@ -161,7 +160,7 @@ func pipelineCommandAction(cmd *cobra.Command, args []string) error {
return errors.New("no pipeline benchmarks found")
}

esClient, err := elasticsearch.NewClient()
esClient, err := stack.NewElasticsearchClient()
if err != nil {
return fmt.Errorf("can't create Elasticsearch client: %w", err)
}
Expand Down Expand Up @@ -258,7 +257,7 @@ func systemCommandAction(cmd *cobra.Command, args []string) error {

signal.Enable()

esClient, err := elasticsearch.NewClient()
esClient, err := stack.NewElasticsearchClient()
if err != nil {
return fmt.Errorf("can't create Elasticsearch client: %w", err)
}
Expand All @@ -267,7 +266,7 @@ func systemCommandAction(cmd *cobra.Command, args []string) error {
return err
}

kc, err := kibana.NewClient()
kc, err := stack.NewKibanaClient()
if err != nil {
return fmt.Errorf("can't create Kibana client: %w", err)
}
Expand Down
5 changes: 3 additions & 2 deletions cmd/dump.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/elastic/elastic-package/internal/dump"
"github.com/elastic/elastic-package/internal/elasticsearch"
"github.com/elastic/elastic-package/internal/kibana"
"github.com/elastic/elastic-package/internal/stack"
)

const dumpLongDescription = `Use this command as an exploratory tool to dump resources from Elastic Stack (objects installed as part of package and agent policies).`
Expand Down Expand Up @@ -79,7 +80,7 @@ func dumpInstalledObjectsCmdAction(cmd *cobra.Command, args []string) error {
if tlsSkipVerify {
clientOptions = append(clientOptions, elasticsearch.OptionWithSkipTLSVerify())
}
client, err := elasticsearch.NewClient(clientOptions...)
client, err := stack.NewElasticsearchClient(clientOptions...)
if err != nil {
return fmt.Errorf("failed to initialize Elasticsearch client: %w", err)
}
Expand Down Expand Up @@ -119,7 +120,7 @@ func dumpAgentPoliciesCmdAction(cmd *cobra.Command, args []string) error {
if tlsSkipVerify {
clientOptions = append(clientOptions, kibana.TLSSkipVerify())
}
kibanaClient, err := kibana.NewClient(clientOptions...)
kibanaClient, err := stack.NewKibanaClient(clientOptions...)
if err != nil {
return fmt.Errorf("failed to initialize Kibana client: %w", err)
}
Expand Down
3 changes: 2 additions & 1 deletion cmd/export.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/elastic/elastic-package/internal/common"
"github.com/elastic/elastic-package/internal/export"
"github.com/elastic/elastic-package/internal/kibana"
"github.com/elastic/elastic-package/internal/stack"
)

const exportLongDescription = `Use this command to export assets relevant for the package, e.g. Kibana dashboards.`
Expand Down Expand Up @@ -65,7 +66,7 @@ func exportDashboardsCmd(cmd *cobra.Command, args []string) error {
return cobraext.FlagParsingError(err, cobraext.AllowSnapshotFlagName)
}

kibanaClient, err := kibana.NewClient(opts...)
kibanaClient, err := stack.NewKibanaClient(opts...)
if err != nil {
return fmt.Errorf("can't create Kibana client: %w", err)
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import (
"github.com/spf13/cobra"

"github.com/elastic/elastic-package/internal/cobraext"
"github.com/elastic/elastic-package/internal/kibana"
"github.com/elastic/elastic-package/internal/packages"
"github.com/elastic/elastic-package/internal/packages/installer"
"github.com/elastic/elastic-package/internal/stack"
)

const installLongDescription = `Use this command to install the package in Kibana.
Expand Down Expand Up @@ -49,7 +49,7 @@ func installCommandAction(cmd *cobra.Command, _ []string) error {
return cobraext.FlagParsingError(err, cobraext.BuildSkipValidationFlagName)
}

kibanaClient, err := kibana.NewClient()
kibanaClient, err := stack.NewKibanaClient()
if err != nil {
return fmt.Errorf("could not create kibana client: %w", err)
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/testrunner.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ import (

"github.com/elastic/elastic-package/internal/cobraext"
"github.com/elastic/elastic-package/internal/common"
"github.com/elastic/elastic-package/internal/elasticsearch"
"github.com/elastic/elastic-package/internal/install"
"github.com/elastic/elastic-package/internal/packages"
"github.com/elastic/elastic-package/internal/signal"
"github.com/elastic/elastic-package/internal/stack"
"github.com/elastic/elastic-package/internal/testrunner"
"github.com/elastic/elastic-package/internal/testrunner/reporters/formats"
"github.com/elastic/elastic-package/internal/testrunner/reporters/outputs"
Expand Down Expand Up @@ -214,7 +214,7 @@ func testTypeCommandActionFactory(runner testrunner.TestRunner) cobraext.Command
return err
}

esClient, err := elasticsearch.NewClient()
esClient, err := stack.NewElasticsearchClient()
if err != nil {
return fmt.Errorf("can't create Elasticsearch client: %w", err)
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/uninstall.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import (
"github.com/spf13/cobra"

"github.com/elastic/elastic-package/internal/cobraext"
"github.com/elastic/elastic-package/internal/kibana"
"github.com/elastic/elastic-package/internal/packages"
"github.com/elastic/elastic-package/internal/packages/installer"
"github.com/elastic/elastic-package/internal/stack"
)

const uninstallLongDescription = `Use this command to uninstall the package in Kibana.
Expand All @@ -40,7 +40,7 @@ func uninstallCommandAction(cmd *cobra.Command, args []string) error {
return fmt.Errorf("locating package root failed: %w", err)
}

kibanaClient, err := kibana.NewClient()
kibanaClient, err := stack.NewKibanaClient()
if err != nil {
return fmt.Errorf("could not create kibana client: %w", err)
}
Expand Down
7 changes: 4 additions & 3 deletions internal/dump/agentpolicies_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/stretchr/testify/suite"

"github.com/elastic/elastic-package/internal/kibana"
"github.com/elastic/elastic-package/internal/stack"
)

func TestDumpAgentPolicies(t *testing.T) {
Expand Down Expand Up @@ -72,7 +73,7 @@ type agentPoliciesDumpSuite struct {
func (s *agentPoliciesDumpSuite) SetupTest() {
_, err := os.Stat(s.DumpDirAll)
if errors.Is(err, os.ErrNotExist) {
client, err := kibana.NewClient()
client, err := stack.NewKibanaClient()
s.Require().NoError(err)

dumper := NewAgentPoliciesDumper(client)
Expand All @@ -85,7 +86,7 @@ func (s *agentPoliciesDumpSuite) SetupTest() {

_, err = os.Stat(s.DumpDirPackage)
if errors.Is(err, os.ErrNotExist) {
client, err := kibana.NewClient()
client, err := stack.NewKibanaClient()
s.Require().NoError(err)

dumper := NewAgentPoliciesDumper(client)
Expand All @@ -98,7 +99,7 @@ func (s *agentPoliciesDumpSuite) SetupTest() {

_, err = os.Stat(s.DumpDirAgentPolicy)
if errors.Is(err, os.ErrNotExist) {
client, err := kibana.NewClient()
client, err := stack.NewKibanaClient()
s.Require().NoError(err)

dumper := NewAgentPoliciesDumper(client)
Expand Down
4 changes: 2 additions & 2 deletions internal/dump/installedobjects_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ import (
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"

"github.com/elastic/elastic-package/internal/elasticsearch"
estest "github.com/elastic/elastic-package/internal/elasticsearch/test"
"github.com/elastic/elastic-package/internal/files"
"github.com/elastic/elastic-package/internal/stack"
)

func TestDumpInstalledObjects(t *testing.T) {
Expand Down Expand Up @@ -64,7 +64,7 @@ type installedObjectsDumpSuite struct {
func (s *installedObjectsDumpSuite) SetupTest() {
_, err := os.Stat(s.DumpDir)
if errors.Is(err, os.ErrNotExist) {
client, err := elasticsearch.NewClient()
client, err := stack.NewElasticsearchClient()
s.Require().NoError(err)

dumper := NewInstalledObjectsDumper(client.API, s.PackageName)
Expand Down
30 changes: 16 additions & 14 deletions internal/elasticsearch/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,12 @@ import (
"fmt"
"io"
"net/http"
"os"
"strings"

"github.com/elastic/go-elasticsearch/v7"
"github.com/elastic/go-elasticsearch/v7/esapi"

"github.com/elastic/elastic-package/internal/certs"
"github.com/elastic/elastic-package/internal/stack"
)

// API contains the elasticsearch APIs
Expand Down Expand Up @@ -47,16 +45,6 @@ type clientOptions struct {
skipTLSVerify bool
}

// defaultOptionsFromEnv returns clientOptions initialized with values from environmet variables.
func defaultOptionsFromEnv() clientOptions {
return clientOptions{
address: os.Getenv(stack.ElasticsearchHostEnv),
username: os.Getenv(stack.ElasticsearchUsernameEnv),
password: os.Getenv(stack.ElasticsearchPasswordEnv),
certificateAuthority: os.Getenv(stack.CACertificateEnv),
}
}

type ClientOption func(*clientOptions)

// OptionWithAddress sets the address to be used by the client.
Expand All @@ -66,6 +54,20 @@ func OptionWithAddress(address string) ClientOption {
}
}

// OptionWithUsername sets the username to be used by the client.
func OptionWithUsername(username string) ClientOption {
return func(opts *clientOptions) {
opts.username = username
}
}

// OptionWithPassword sets the password to be used by the client.
func OptionWithPassword(password string) ClientOption {
return func(opts *clientOptions) {
opts.password = password
}
}

// OptionWithCertificateAuthority sets the certificate authority to be used by the client.
func OptionWithCertificateAuthority(certificateAuthority string) ClientOption {
return func(opts *clientOptions) {
Expand All @@ -87,13 +89,13 @@ type Client struct {

// NewClient method creates new instance of the Elasticsearch client.
func NewClient(customOptions ...ClientOption) (*Client, error) {
options := defaultOptionsFromEnv()
options := clientOptions{}
for _, option := range customOptions {
option(&options)
}

if options.address == "" {
return nil, stack.UndefinedEnvError(stack.ElasticsearchHostEnv)
return nil, ErrUndefinedAddress
}

config := elasticsearch.Config{
Expand Down
3 changes: 3 additions & 0 deletions internal/elasticsearch/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package elasticsearch
import (
"bytes"
"encoding/json"
"errors"
"fmt"
)

Expand Down Expand Up @@ -74,3 +75,5 @@ func NewError(body []byte) error {
// Fall back to including to raw body if it cannot be parsed.
return fmt.Errorf("elasticsearch error: %v", string(body))
}

var ErrUndefinedAddress = errors.New("missing Elasticsearch address")
5 changes: 3 additions & 2 deletions internal/elasticsearch/test/httptest.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/stretchr/testify/require"

"github.com/elastic/elastic-package/internal/elasticsearch"
"github.com/elastic/elastic-package/internal/stack"
)

// NewClient returns a client for a testing http server that uses prerecorded
Expand All @@ -26,7 +27,7 @@ func NewClient(t *testing.T, serverDataDir string) *elasticsearch.Client {
server := testElasticsearchServer(t, serverDataDir)
t.Cleanup(func() { server.Close() })

client, err := elasticsearch.NewClient(
client, err := stack.NewElasticsearchClient(
elasticsearch.OptionWithAddress(server.URL),
)
require.NoError(t, err)
Expand Down Expand Up @@ -56,7 +57,7 @@ func pathForURL(url string) string {
}

func recordRequest(t *testing.T, r *http.Request, path string) {
client, err := elasticsearch.NewClient()
client, err := stack.NewElasticsearchClient()
require.NoError(t, err)

t.Logf("Recording %s in %s", r.URL.Path, path)
Expand Down
34 changes: 19 additions & 15 deletions internal/kibana/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,19 @@ package kibana
import (
"bytes"
"crypto/tls"
"errors"
"fmt"
"io"
"net/http"
"net/url"
"os"

"github.com/elastic/elastic-package/internal/certs"
"github.com/elastic/elastic-package/internal/install"
"github.com/elastic/elastic-package/internal/logger"
"github.com/elastic/elastic-package/internal/stack"
)

var ErrUndefinedHost = errors.New("missing kibana host")

// Client is responsible for exporting dashboards from Kibana.
type Client struct {
host string
Expand All @@ -34,24 +35,13 @@ type ClientOption func(*Client)

// NewClient creates a new instance of the client.
func NewClient(opts ...ClientOption) (*Client, error) {
host := os.Getenv(stack.KibanaHostEnv)
username := os.Getenv(stack.ElasticsearchUsernameEnv)
password := os.Getenv(stack.ElasticsearchPasswordEnv)
certificateAuthority := os.Getenv(stack.CACertificateEnv)

c := &Client{
host: host,
username: username,
password: password,
certificateAuthority: certificateAuthority,
}

c := &Client{}
for _, opt := range opts {
opt(c)
}

if c.host == "" {
return nil, stack.UndefinedEnvError(stack.KibanaHostEnv)
return nil, ErrUndefinedHost
}

return c, nil
Expand All @@ -71,6 +61,20 @@ func TLSSkipVerify() ClientOption {
}
}

// Username option sets the username to be used by the client.
func Username(username string) ClientOption {
return func(c *Client) {
c.username = username
}
}

// Password option sets the password to be used by the client.
func Password(password string) ClientOption {
return func(c *Client) {
c.password = password
}
}

// CertificateAuthority sets the certificate authority to be used by the client.
func CertificateAuthority(certificateAuthority string) ClientOption {
return func(c *Client) {
Expand Down
Loading