Full Mattermost server source with integrated Community Enterprise features. Includes vendor directory for offline/air-gapped builds. Structure: - enterprise-impl/: Enterprise feature implementations - enterprise-community/: Init files that register implementations - enterprise/: Bridge imports (community_imports.go) - vendor/: All dependencies for offline builds Build (online): go build ./cmd/mattermost Build (offline/air-gapped): go build -mod=vendor ./cmd/mattermost 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
175 lines
5.0 KiB
Go
175 lines
5.0 KiB
Go
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
// The OpenSearch Contributors require contributions made to
|
|
// this file be licensed under the Apache-2.0 license or a
|
|
// compatible open source license.
|
|
|
|
package opensearchapi
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/opensearch-project/opensearch-go/v4"
|
|
)
|
|
|
|
// Config represents the client configuration
|
|
type Config struct {
|
|
Client opensearch.Config
|
|
}
|
|
|
|
// Client represents the opensearchapi Client summarizing all API calls
|
|
type Client struct {
|
|
Client *opensearch.Client
|
|
Cat catClient
|
|
Cluster clusterClient
|
|
Dangling danglingClient
|
|
Document documentClient
|
|
Indices indicesClient
|
|
Nodes nodesClient
|
|
Script scriptClient
|
|
ComponentTemplate componentTemplateClient
|
|
IndexTemplate indexTemplateClient
|
|
// Deprecated: uses legacy API (/_template), correct API is /_index_template, use IndexTemplate instead
|
|
Template templateClient
|
|
DataStream dataStreamClient
|
|
PointInTime pointInTimeClient
|
|
Ingest ingestClient
|
|
Tasks tasksClient
|
|
Scroll scrollClient
|
|
Snapshot snapshotClient
|
|
}
|
|
|
|
// clientInit inits the Client with all sub clients
|
|
func clientInit(rootClient *opensearch.Client) *Client {
|
|
client := &Client{
|
|
Client: rootClient,
|
|
}
|
|
client.Cat = catClient{apiClient: client}
|
|
client.Indices = indicesClient{
|
|
apiClient: client,
|
|
Alias: aliasClient{apiClient: client},
|
|
Mapping: mappingClient{apiClient: client},
|
|
Settings: settingsClient{apiClient: client},
|
|
}
|
|
client.Nodes = nodesClient{apiClient: client}
|
|
client.Cluster = clusterClient{apiClient: client}
|
|
client.Dangling = danglingClient{apiClient: client}
|
|
client.Script = scriptClient{apiClient: client}
|
|
client.Document = documentClient{apiClient: client}
|
|
client.ComponentTemplate = componentTemplateClient{apiClient: client}
|
|
client.IndexTemplate = indexTemplateClient{apiClient: client}
|
|
client.Template = templateClient{apiClient: client}
|
|
client.DataStream = dataStreamClient{apiClient: client}
|
|
client.PointInTime = pointInTimeClient{apiClient: client}
|
|
client.Ingest = ingestClient{apiClient: client}
|
|
client.Tasks = tasksClient{apiClient: client}
|
|
client.Scroll = scrollClient{apiClient: client}
|
|
client.Snapshot = snapshotClient{
|
|
apiClient: client,
|
|
Repository: repositoryClient{apiClient: client},
|
|
}
|
|
|
|
return client
|
|
}
|
|
|
|
// NewClient returns a opensearchapi client
|
|
func NewClient(config Config) (*Client, error) {
|
|
rootClient, err := opensearch.NewClient(config.Client)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return clientInit(rootClient), nil
|
|
}
|
|
|
|
// NewDefaultClient returns a opensearchapi client using defaults
|
|
func NewDefaultClient() (*Client, error) {
|
|
rootClient, err := opensearch.NewClient(opensearch.Config{
|
|
Addresses: []string{"http://localhost:9200"},
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return clientInit(rootClient), nil
|
|
}
|
|
|
|
// do calls the opensearch.Client.Do() and checks the response for openseach api errors
|
|
func (c *Client) do(ctx context.Context, req opensearch.Request, dataPointer any) (*opensearch.Response, error) {
|
|
resp, err := c.Client.Do(ctx, req, dataPointer)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if resp.IsError() {
|
|
if dataPointer != nil {
|
|
return resp, opensearch.ParseError(resp)
|
|
} else {
|
|
return resp, fmt.Errorf("status: %s", resp.Status())
|
|
}
|
|
}
|
|
|
|
return resp, nil
|
|
}
|
|
|
|
// formatDuration converts duration to a string in the format
|
|
// accepted by Opensearch.
|
|
func formatDuration(d time.Duration) string {
|
|
if d < time.Millisecond {
|
|
return strconv.FormatInt(int64(d), 10) + "nanos"
|
|
}
|
|
|
|
return strconv.FormatInt(int64(d)/int64(time.Millisecond), 10) + "ms"
|
|
}
|
|
|
|
// ToPointer converts any value to a pointer, mainly used for request parameters
|
|
func ToPointer[V any](value V) *V {
|
|
return &value
|
|
}
|
|
|
|
// ResponseShards is a sub type of api repsonses containing information about shards
|
|
type ResponseShards struct {
|
|
Total int `json:"total"`
|
|
Successful int `json:"successful"`
|
|
Failed int `json:"failed"`
|
|
Failures []ResponseShardsFailure `json:"failures"`
|
|
Skipped int `json:"skipped"`
|
|
}
|
|
|
|
// ResponseShardsFailure is a sub type of ReponseShards containing information about a failed shard
|
|
type ResponseShardsFailure struct {
|
|
Shard int `json:"shard"`
|
|
Index any `json:"index"`
|
|
Node string `json:"node"`
|
|
Reason struct {
|
|
Type string `json:"type"`
|
|
Reason string `json:"reason"`
|
|
} `json:"reason"`
|
|
}
|
|
|
|
// FailuresCause contains information about failure cause
|
|
type FailuresCause struct {
|
|
Type string `json:"type"`
|
|
Reason string `json:"reason"`
|
|
NodeID string `json:"node_id"`
|
|
Cause *struct {
|
|
Type string `json:"type"`
|
|
Reason string `json:"reason"`
|
|
Cause *struct {
|
|
Type string `json:"type"`
|
|
Reason *string `json:"reason"`
|
|
} `json:"caused_by,omitempty"`
|
|
} `json:"caused_by,omitempty"`
|
|
}
|
|
|
|
// FailuresShard contains information about shard failures
|
|
type FailuresShard struct {
|
|
Shard int `json:"shard"`
|
|
Index string `json:"index"`
|
|
Status string `json:"status"`
|
|
Reason FailuresCause `json:"reason"`
|
|
}
|