From b9d6af34cdbbd34c524a53b1611d84bce444ca26 Mon Sep 17 00:00:00 2001 From: Dana Axinte <53751979+dana-axinte@users.noreply.github.com> Date: Fri, 13 Dec 2024 05:59:43 -0500 Subject: [PATCH] CloudMigrations: Obtain gcom plugins to enable plugins migration (#97784) * just api * preallocate --- .../cloudmigrationimpl/gcomstub.go | 21 ++++++++ pkg/services/gcom/gcom.go | 54 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/pkg/services/cloudmigration/cloudmigrationimpl/gcomstub.go b/pkg/services/cloudmigration/cloudmigrationimpl/gcomstub.go index bce5d0a6134..63c115c6881 100644 --- a/pkg/services/cloudmigration/cloudmigrationimpl/gcomstub.go +++ b/pkg/services/cloudmigration/cloudmigrationimpl/gcomstub.go @@ -23,3 +23,24 @@ func (client *gcomStub) GetInstanceByID(_ context.Context, _ string, instanceID ClusterSlug: "fake-cluser", }, nil } + +func (client *gcomStub) GetPlugins(ctx context.Context, requestID string) (map[string]gcom.Plugin, error) { + plugins := map[string]gcom.Plugin{ + "plugin-external-valid-grafana": { + Slug: "plugin-external-valid-grafana", + Status: "active", + SignatureType: "grafana", + }, + "plugin-external-valid-commercial": { + Slug: "plugin-external-valid-commercial", + Status: "active", + SignatureType: "commercial", + }, + "plugin-external-valid-community": { + Slug: "active-plugin", + Status: "active", + SignatureType: "community", + }, + } + return plugins, nil +} diff --git a/pkg/services/gcom/gcom.go b/pkg/services/gcom/gcom.go index b780be988d2..11a18ced5dc 100644 --- a/pkg/services/gcom/gcom.go +++ b/pkg/services/gcom/gcom.go @@ -18,6 +18,7 @@ var ErrTokenNotFound = errors.New("gcom: token not found") type Service interface { GetInstanceByID(ctx context.Context, requestID string, instanceID string) (Instance, error) + GetPlugins(ctx context.Context, requestID string) (map[string]Plugin, error) } type Instance struct { @@ -28,6 +29,15 @@ type Instance struct { OrgId int `json:"orgId"` } +type Plugin struct { + Slug string `json:"slug"` + Status string `json:"status"` + SignatureType string `json:"signatureType"` +} +type listPluginsResponse struct { + Items []Plugin `json:"items"` +} + type GcomClient struct { log log.Logger cfg Config @@ -85,3 +95,47 @@ func (client *GcomClient) GetInstanceByID(ctx context.Context, requestID string, return instance, nil } + +func (client *GcomClient) GetPlugins(ctx context.Context, requestID string) (map[string]Plugin, error) { + endpoint, err := url.JoinPath(client.cfg.ApiURL, "/plugins") + if err != nil { + return nil, fmt.Errorf("building gcom instance url: %w", err) + } + + request, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil) + if err != nil { + return nil, fmt.Errorf("creating http request: %w", err) + } + + request.Header.Set("x-request-id", requestID) + request.Header.Set("Content-Type", "application/json") + + response, err := client.httpClient.Do(request) + if err != nil { + return nil, fmt.Errorf("sending http request to get plugins: %w", err) + } + defer func() { + if err := response.Body.Close(); err != nil { + client.log.Error("closing http response body", "err", err.Error()) + } + }() + + if response.StatusCode != http.StatusOK { + body, _ := io.ReadAll(response.Body) + return nil, fmt.Errorf("unexpected response when obtaining plugins: code=%d body=%s", response.StatusCode, body) + } + + var body listPluginsResponse + if err := json.NewDecoder(response.Body).Decode(&body); err != nil { + return nil, fmt.Errorf("unmarshaling response body: %w", err) + } + + // Return only active or enterprise plugins + resPlugins := make(map[string]Plugin, len(body.Items)) + for _, plugin := range body.Items { + if plugin.Status == "active" || plugin.Status == "enterprise" { + resPlugins[plugin.Slug] = plugin + } + } + return resPlugins, nil +}