Skip to content

Commit f1468cd

Browse files
authored
Stop using deprecated Fleet APIs (#1420)
Stop using Fleet APIs deprecated since 8.0 (https://www.elastic.co/guide/en/kibana/master/release-notes-8.0.0-rc1.html#deprecations-8.0.0-rc1). The only one that seems we are using is: > Use /epm/packages/{packageName}/{version} instead of /epm/packages/{pkgkey}. Kibana client retrieves its version from the status API on initialization now.
1 parent 17e931d commit f1468cd

File tree

8 files changed

+66
-21
lines changed

8 files changed

+66
-21
lines changed

internal/dump/agentpolicies_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
"github.com/stretchr/testify/suite"
1414

15-
"github.com/elastic/elastic-package/internal/kibana"
15+
kibanatest "github.com/elastic/elastic-package/internal/kibana/test"
1616
"github.com/elastic/elastic-package/internal/stack"
1717
)
1818

@@ -111,7 +111,7 @@ func (s *agentPoliciesDumpSuite) SetupTest() {
111111
}
112112

113113
func (s *agentPoliciesDumpSuite) TestDumpAll() {
114-
client := kibana.NewTestClient(s.T(), s.RecordDir)
114+
client := kibanatest.NewClient(s.T(), s.RecordDir)
115115

116116
outputDir := s.T().TempDir()
117117
dumper := NewAgentPoliciesDumper(client)
@@ -128,7 +128,7 @@ func (s *agentPoliciesDumpSuite) TestDumpAll() {
128128
}
129129

130130
func (s *agentPoliciesDumpSuite) TestDumpByPackage() {
131-
client := kibana.NewTestClient(s.T(), s.RecordDir)
131+
client := kibanatest.NewClient(s.T(), s.RecordDir)
132132

133133
outputDir := s.T().TempDir()
134134
dumper := NewAgentPoliciesDumper(client)
@@ -145,7 +145,7 @@ func (s *agentPoliciesDumpSuite) TestDumpByPackage() {
145145
}
146146

147147
func (s *agentPoliciesDumpSuite) TestDumpByName() {
148-
client := kibana.NewTestClient(s.T(), s.RecordDir)
148+
client := kibanatest.NewClient(s.T(), s.RecordDir)
149149

150150
outputDir := s.T().TempDir()
151151
dumper := NewAgentPoliciesDumper(client)

internal/dump/testdata/fleet-7-mock-dump-all/api-status.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"name":"kibana","uuid":"4d61db22-fa55-4750-91b8-dd344522c879","version":{"number":"8.0.0","build_hash":"57ca5e139a33dd2eed927ce98d8231a1f217cd15","build_number":49192,"build_snapshot":false},"status":{"overall":{"level":"available","summary":"All services are available"},"core":{"elasticsearch":{"level":"available","summary":"Elasticsearch is available","meta":{"warningNodes":[],"incompatibleNodes":[]}},"savedObjects":{"level":"available","summary":"SavedObjects service has completed migrations and is available","meta":{"migratedIndices":{"migrated":0,"skipped":0,"patched":2}}}},"plugins":{"advancedSettings":{"level":"available","summary":"All dependencies are available"},"bfetch":{"level":"available","summary":"All dependencies are available"},"expressionMetricVis":{"level":"available","summary":"All dependencies are available"},"expressionTagcloud":{"level":"available","summary":"All dependencies are available"},"charts":{"level":"available","summary":"All dependencies are available"},"console":{"level":"available","summary":"All dependencies are available"},"customIntegrations":{"level":"available","summary":"All dependencies are available"},"dashboard":{"level":"available","summary":"All dependencies are available"},"data":{"level":"available","summary":"All dependencies are available"},"dataViews":{"level":"available","summary":"All dependencies are available"},"devTools":{"level":"available","summary":"All dependencies are available"},"discover":{"level":"available","summary":"All dependencies are available"},"embeddable":{"level":"available","summary":"All dependencies are available"},"esUiShared":{"level":"available","summary":"All dependencies are available"},"expressionError":{"level":"available","summary":"All dependencies are available"},"expressionImage":{"level":"available","summary":"All dependencies are available"},"expressionMetric":{"level":"available","summary":"All dependencies are available"},"expressionRepeatImage":{"level":"available","summary":"All dependencies are available"},"expressionRevealImage":{"level":"available","summary":"All dependencies are available"},"expressionShape":{"level":"available","summary":"All dependencies are available"},"expressions":{"level":"available","summary":"All dependencies are available"},"fieldFormats":{"level":"available","summary":"All dependencies are available"},"home":{"level":"available","summary":"All dependencies are available"},"indexPatternEditor":{"level":"available","summary":"All dependencies are available"},"indexPatternFieldEditor":{"level":"available","summary":"All dependencies are available"},"indexPatternManagement":{"level":"available","summary":"All dependencies are available"},"inputControlVis":{"level":"available","summary":"All dependencies are available"},"inspector":{"level":"available","summary":"All dependencies are available"},"kibanaLegacy":{"level":"available","summary":"All dependencies are available"},"kibanaOverview":{"level":"available","summary":"All dependencies are available"},"kibanaReact":{"level":"available","summary":"All dependencies are available"},"kibanaUsageCollection":{"level":"available","summary":"All dependencies are available"},"kibanaUtils":{"level":"available","summary":"All dependencies are available"},"management":{"level":"available","summary":"All dependencies are available"},"mapsEms":{"level":"available","summary":"All dependencies are available"},"navigation":{"level":"available","summary":"All dependencies are available"},"newsfeed":{"level":"available","summary":"All dependencies are available"},"presentationUtil":{"level":"available","summary":"All dependencies are available"},"savedObjects":{"level":"available","summary":"All dependencies are available"},"savedObjectsManagement":{"level":"available","summary":"All dependencies are available"},"savedObjectsTaggingOss":{"level":"available","summary":"All dependencies are available"},"screenshotMode":{"level":"available","summary":"All dependencies are available"},"share":{"level":"available","summary":"All dependencies are available"},"telemetry":{"level":"available","summary":"All dependencies are available"},"telemetryCollectionManager":{"level":"available","summary":"All dependencies are available"},"telemetryManagementSection":{"level":"available","summary":"All dependencies are available"},"uiActions":{"level":"available","summary":"All dependencies are available"},"urlForwarding":{"level":"available","summary":"All dependencies are available"},"usageCollection":{"level":"available","summary":"All dependencies are available"},"visDefaultEditor":{"level":"available","summary":"All dependencies are available"},"visTypeMarkdown":{"level":"available","summary":"All dependencies are available"},"visTypeMetric":{"level":"available","summary":"All dependencies are available"},"visTypePie":{"level":"available","summary":"All dependencies are available"},"visTypeTable":{"level":"available","summary":"All dependencies are available"},"visTypeTagcloud":{"level":"available","summary":"All dependencies are available"},"visTypeTimelion":{"level":"available","summary":"All dependencies are available"},"visTypeTimeseries":{"level":"available","summary":"All dependencies are available"},"visTypeVega":{"level":"available","summary":"All dependencies are available"},"visTypeVislib":{"level":"available","summary":"All dependencies are available"},"visTypeXy":{"level":"available","summary":"All dependencies are available"},"visualizations":{"level":"available","summary":"All dependencies are available"},"visualize":{"level":"available","summary":"All dependencies are available"},"actions":{"level":"available","summary":"All dependencies are available"},"alerting":{"level":"available","summary":"Alerting is (probably) ready"},"apm":{"level":"available","summary":"All dependencies are available"},"banners":{"level":"available","summary":"All dependencies are available"},"canvas":{"level":"available","summary":"All dependencies are available"},"cases":{"level":"available","summary":"All dependencies are available"},"cloud":{"level":"available","summary":"All dependencies are available"},"crossClusterReplication":{"level":"available","summary":"All dependencies are available"},"dashboardEnhanced":{"level":"available","summary":"All dependencies are available"},"dataEnhanced":{"level":"available","summary":"All dependencies are available"},"dataVisualizer":{"level":"available","summary":"All dependencies are available"},"discoverEnhanced":{"level":"available","summary":"All dependencies are available"},"urlDrilldown":{"level":"available","summary":"All dependencies are available"},"embeddableEnhanced":{"level":"available","summary":"All dependencies are available"},"encryptedSavedObjects":{"level":"available","summary":"All dependencies are available"},"enterpriseSearch":{"level":"available","summary":"All dependencies are available"},"eventLog":{"level":"available","summary":"All dependencies are available"},"features":{"level":"available","summary":"All dependencies are available"},"fileUpload":{"level":"available","summary":"All dependencies are available"},"fleet":{"level":"available","summary":"Fleet is available"},"globalSearch":{"level":"available","summary":"All dependencies are available"},"globalSearchBar":{"level":"available","summary":"All dependencies are available"},"globalSearchProviders":{"level":"available","summary":"All dependencies are available"},"graph":{"level":"available","summary":"All dependencies are available"},"grokdebugger":{"level":"available","summary":"All dependencies are available"},"indexLifecycleManagement":{"level":"available","summary":"All dependencies are available"},"indexManagement":{"level":"available","summary":"All dependencies are available"},"infra":{"level":"available","summary":"All dependencies are available"},"ingestPipelines":{"level":"available","summary":"All dependencies are available"},"lens":{"level":"available","summary":"All dependencies are available"},"licenseApiGuard":{"level":"available","summary":"All dependencies are available"},"licenseManagement":{"level":"available","summary":"All dependencies are available"},"licensing":{"level":"available","summary":"License fetched"},"lists":{"level":"available","summary":"All dependencies are available"},"logstash":{"level":"available","summary":"All dependencies are available"},"maps":{"level":"available","summary":"All dependencies are available"},"ml":{"level":"available","summary":"All dependencies are available"},"monitoring":{"level":"available","summary":"All dependencies are available"},"observability":{"level":"available","summary":"All dependencies are available"},"osquery":{"level":"available","summary":"All dependencies are available"},"painlessLab":{"level":"available","summary":"All dependencies are available"},"remoteClusters":{"level":"available","summary":"All dependencies are available"},"reporting":{"level":"available","summary":"All dependencies are available"},"rollup":{"level":"available","summary":"All dependencies are available"},"ruleRegistry":{"level":"available","summary":"All dependencies are available"},"runtimeFields":{"level":"available","summary":"All dependencies are available"},"savedObjectsTagging":{"level":"available","summary":"All dependencies are available"},"screenshotting":{"level":"available","summary":"All dependencies are available"},"searchprofiler":{"level":"available","summary":"All dependencies are available"},"security":{"level":"available","summary":"All dependencies are available"},"securitySolution":{"level":"available","summary":"All dependencies are available"},"snapshotRestore":{"level":"available","summary":"All dependencies are available"},"spaces":{"level":"available","summary":"All dependencies are available"},"stackAlerts":{"level":"available","summary":"All dependencies are available"},"taskManager":{"level":"available","summary":"All dependencies are available"},"telemetryCollectionXpack":{"level":"available","summary":"All dependencies are available"},"timelines":{"level":"available","summary":"All dependencies are available"},"transform":{"level":"available","summary":"All dependencies are available"},"translations":{"level":"available","summary":"All dependencies are available"},"triggersActionsUi":{"level":"available","summary":"All dependencies are available"},"uiActionsEnhanced":{"level":"available","summary":"All dependencies are available"},"upgradeAssistant":{"level":"available","summary":"All dependencies are available"},"uptime":{"level":"available","summary":"All dependencies are available"},"watcher":{"level":"available","summary":"All dependencies are available"}}},"metrics":{"last_updated":"2023-08-30T11:53:46.940Z","collection_interval_in_millis":5000,"os":{"platform":"linux","platformRelease":"linux-5.19.0-50-generic","load":{"1m":3.9,"5m":2.38,"15m":1.66},"memory":{"total_in_bytes":33358266368,"free_in_bytes":276086784,"used_in_bytes":33082179584},"uptime_in_millis":775478260,"distro":"Ubuntu","distroRelease":"Ubuntu-20.04"},"process":{"memory":{"heap":{"total_in_bytes":467066880,"used_in_bytes":369791072,"size_limit":4345298944},"resident_set_size_in_bytes":553046016},"pid":7,"event_loop_delay":10.310148231404959,"event_loop_delay_histogram":{"min":9.09312,"max":38.502399,"mean":10.310148231404959,"exceeds":0,"stddev":1.6360547505591572,"fromTimestamp":"2023-08-30T11:53:41.937Z","lastUpdatedAt":"2023-08-30T11:53:46.935Z","percentiles":{"50":10.100735,"75":10.117119,"95":10.895359,"99":14.811135}},"uptime_in_millis":90449.453821},"processes":[{"memory":{"heap":{"total_in_bytes":467066880,"used_in_bytes":369791072,"size_limit":4345298944},"resident_set_size_in_bytes":553046016},"pid":7,"event_loop_delay":10.310148231404959,"event_loop_delay_histogram":{"min":9.09312,"max":38.502399,"mean":10.310148231404959,"exceeds":0,"stddev":1.6360547505591572,"fromTimestamp":"2023-08-30T11:53:41.937Z","lastUpdatedAt":"2023-08-30T11:53:46.935Z","percentiles":{"50":10.100735,"75":10.117119,"95":10.895359,"99":14.811135}},"uptime_in_millis":90449.453821}],"response_times":{"avg_in_millis":26,"max_in_millis":26},"concurrent_connections":7,"requests":{"disconnects":0,"total":1,"statusCodes":{"200":1},"status_codes":{"200":1}}}}

internal/kibana/client.go

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"net/http"
1414
"net/url"
1515

16+
"github.com/Masterminds/semver/v3"
17+
1618
"github.com/elastic/elastic-package/internal/certs"
1719
"github.com/elastic/elastic-package/internal/install"
1820
"github.com/elastic/elastic-package/internal/logger"
@@ -28,6 +30,9 @@ type Client struct {
2830

2931
certificateAuthority string
3032
tlSkipVerify bool
33+
34+
versionInfo VersionInfo
35+
semver *semver.Version
3136
}
3237

3338
// ClientOption is functional option modifying Kibana client.
@@ -44,6 +49,21 @@ func NewClient(opts ...ClientOption) (*Client, error) {
4449
return nil, ErrUndefinedHost
4550
}
4651

52+
// Allow to initialize version from tests.
53+
var zeroVersion VersionInfo
54+
if c.semver == nil || c.versionInfo == zeroVersion {
55+
v, err := c.requestVersion()
56+
if err != nil {
57+
return nil, fmt.Errorf("failed to get Kibana version: %w", err)
58+
}
59+
c.versionInfo = v
60+
61+
c.semver, err = semver.NewVersion(c.versionInfo.Number)
62+
if err != nil {
63+
return nil, fmt.Errorf("failed to parse Kibana version (%s): %w", c.versionInfo.Number, err)
64+
}
65+
}
66+
4767
return c, nil
4868
}
4969

@@ -83,22 +103,22 @@ func CertificateAuthority(certificateAuthority string) ClientOption {
83103
}
84104

85105
func (c *Client) get(resourcePath string) (int, []byte, error) {
86-
return c.sendRequest(http.MethodGet, resourcePath, nil)
106+
return c.SendRequest(http.MethodGet, resourcePath, nil)
87107
}
88108

89109
func (c *Client) post(resourcePath string, body []byte) (int, []byte, error) {
90-
return c.sendRequest(http.MethodPost, resourcePath, body)
110+
return c.SendRequest(http.MethodPost, resourcePath, body)
91111
}
92112

93113
func (c *Client) put(resourcePath string, body []byte) (int, []byte, error) {
94-
return c.sendRequest(http.MethodPut, resourcePath, body)
114+
return c.SendRequest(http.MethodPut, resourcePath, body)
95115
}
96116

97117
func (c *Client) delete(resourcePath string) (int, []byte, error) {
98-
return c.sendRequest(http.MethodDelete, resourcePath, nil)
118+
return c.SendRequest(http.MethodDelete, resourcePath, nil)
99119
}
100120

101-
func (c *Client) sendRequest(method, resourcePath string, body []byte) (int, []byte, error) {
121+
func (c *Client) SendRequest(method, resourcePath string, body []byte) (int, []byte, error) {
102122
request, err := c.newRequest(method, resourcePath, bytes.NewReader(body))
103123
if err != nil {
104124
return 0, nil, err

internal/kibana/client_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import (
1515
"path/filepath"
1616
"testing"
1717

18+
"github.com/Masterminds/semver/v3"
19+
1820
"github.com/stretchr/testify/assert"
1921
"github.com/stretchr/testify/require"
2022
)
@@ -26,24 +28,29 @@ func TestClientWithTLS(t *testing.T) {
2628

2729
caCertFile := writeCACertFile(t, server.Certificate())
2830

31+
version := func(c *Client) {
32+
c.versionInfo = VersionInfo{Number: "8.0.0"}
33+
c.semver = semver.MustParse(c.versionInfo.Number)
34+
}
35+
2936
t.Run("no TLS config, should fail", func(t *testing.T) {
30-
client, err := NewClient(Address(server.URL))
37+
client, err := NewClient(version, Address(server.URL))
3138
require.NoError(t, err)
3239

3340
_, _, err = client.get("/")
3441
assert.Error(t, err)
3542
})
3643

3744
t.Run("with CA", func(t *testing.T) {
38-
client, err := NewClient(Address(server.URL), CertificateAuthority(caCertFile))
45+
client, err := NewClient(version, Address(server.URL), CertificateAuthority(caCertFile))
3946
require.NoError(t, err)
4047

4148
_, _, err = client.get("/")
4249
assert.NoError(t, err)
4350
})
4451

4552
t.Run("skip TLS verify", func(t *testing.T) {
46-
client, err := NewClient(Address(server.URL), TLSSkipVerify())
53+
client, err := NewClient(version, Address(server.URL), TLSSkipVerify())
4754
require.NoError(t, err)
4855

4956
_, _, err = client.get("/")

internal/kibana/packages.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515

1616
// InstallPackage installs the given package in Fleet.
1717
func (c *Client) InstallPackage(name, version string) ([]packages.Asset, error) {
18-
path := fmt.Sprintf("%s/epm/packages/%s-%s", FleetAPI, name, version)
18+
path := c.epmPackageUrl(name, version)
1919
reqBody := []byte(`{"force":true}`) // allows installing older versions of the package being tested
2020

2121
statusCode, respBody, err := c.post(path, reqBody)
@@ -52,7 +52,7 @@ func (c *Client) InstallZipPackage(zipFile string) ([]packages.Asset, error) {
5252

5353
// RemovePackage removes the given package from Fleet.
5454
func (c *Client) RemovePackage(name, version string) ([]packages.Asset, error) {
55-
path := fmt.Sprintf("%s/epm/packages/%s-%s", FleetAPI, name, version)
55+
path := c.epmPackageUrl(name, version)
5656
statusCode, respBody, err := c.delete(path)
5757
if err != nil {
5858
return nil, fmt.Errorf("could not delete package: %w", err)
@@ -61,6 +61,15 @@ func (c *Client) RemovePackage(name, version string) ([]packages.Asset, error) {
6161
return processResults("remove", statusCode, respBody)
6262
}
6363

64+
func (c *Client) epmPackageUrl(name, version string) string {
65+
switch {
66+
case c.semver.Major() < 8:
67+
return fmt.Sprintf("%s/epm/packages/%s-%s", FleetAPI, name, version)
68+
default:
69+
return fmt.Sprintf("%s/epm/packages/%s/%s", FleetAPI, name, version)
70+
}
71+
}
72+
6473
func processResults(action string, statusCode int, respBody []byte) ([]packages.Asset, error) {
6574
if statusCode != http.StatusOK {
6675
return nil, fmt.Errorf("could not %s package; API status code = %d; response body = %s", action, statusCode, respBody)

internal/kibana/status.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ type statusType struct {
3434

3535
// Version method returns the version of Kibana (Elastic stack)
3636
func (c *Client) Version() (VersionInfo, error) {
37+
return c.versionInfo, nil
38+
}
39+
40+
func (c *Client) requestVersion() (VersionInfo, error) {
3741
var version VersionInfo
3842
statusCode, respBody, err := c.get(StatusAPI)
3943
if err != nil {

0 commit comments

Comments
 (0)