mirror of
https://github.com/grafana/grafana.git
synced 2024-12-01 21:19:28 -06:00
94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
package request
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"k8s.io/apiserver/pkg/endpoints/request"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/appcontext"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
)
|
|
|
|
type NamespaceInfo struct {
|
|
// OrgID defined in namespace (1 when using stack ids)
|
|
OrgID int64
|
|
|
|
// The cloud stack ID (must match the value in cfg.Settings)
|
|
StackID string
|
|
|
|
// The original namespace string regardless the input
|
|
Value string
|
|
}
|
|
|
|
// NamespaceMapper converts an orgID into a namespace
|
|
type NamespaceMapper = func(orgId int64) string
|
|
|
|
// GetNamespaceMapper returns a function that will convert orgIds into a consistent namespace
|
|
func GetNamespaceMapper(cfg *setting.Cfg) NamespaceMapper {
|
|
if cfg != nil && cfg.StackID != "" {
|
|
return func(orgId int64) string { return "stack-" + cfg.StackID }
|
|
}
|
|
return func(orgId int64) string {
|
|
if orgId == 1 {
|
|
return "default"
|
|
}
|
|
return fmt.Sprintf("org-%d", orgId)
|
|
}
|
|
}
|
|
|
|
func NamespaceInfoFrom(ctx context.Context, requireOrgID bool) (NamespaceInfo, error) {
|
|
info, err := ParseNamespace(request.NamespaceValue(ctx))
|
|
if err == nil && requireOrgID && info.OrgID < 1 {
|
|
return info, fmt.Errorf("expected valid orgId in namespace")
|
|
}
|
|
return info, err
|
|
}
|
|
|
|
func ParseNamespace(ns string) (NamespaceInfo, error) {
|
|
info := NamespaceInfo{Value: ns, OrgID: -1}
|
|
if ns == "default" {
|
|
info.OrgID = 1
|
|
return info, nil
|
|
}
|
|
|
|
if strings.HasPrefix(ns, "org-") {
|
|
id, err := strconv.Atoi(ns[4:])
|
|
if id < 1 {
|
|
return info, fmt.Errorf("invalid org id")
|
|
}
|
|
if id == 1 {
|
|
return info, fmt.Errorf("use default rather than org-1")
|
|
}
|
|
info.OrgID = int64(id)
|
|
return info, err
|
|
}
|
|
|
|
if strings.HasPrefix(ns, "stack-") {
|
|
stackIDStr := ns[6:]
|
|
stackID, err := strconv.Atoi(stackIDStr)
|
|
if err != nil || stackID < 1 {
|
|
return info, fmt.Errorf("invalid stack id")
|
|
}
|
|
info.StackID = stackIDStr
|
|
info.OrgID = 1
|
|
return info, nil
|
|
}
|
|
return info, nil
|
|
}
|
|
|
|
func OrgIDForList(ctx context.Context) (int64, error) {
|
|
ns := request.NamespaceValue(ctx)
|
|
if ns == "" {
|
|
user, err := appcontext.User(ctx)
|
|
if user != nil {
|
|
return user.OrgID, err
|
|
}
|
|
return -1, err
|
|
}
|
|
info, err := ParseNamespace(ns)
|
|
return info.OrgID, err
|
|
}
|