77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
package storage
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/util/sets"
|
|
genericrequest "k8s.io/apiserver/pkg/endpoints/request"
|
|
)
|
|
|
|
var (
|
|
apiPrefixes = sets.NewString("api", "apis")
|
|
groupLessAPIPrefixes = sets.NewString("api")
|
|
)
|
|
|
|
func parseK8sNativeResourceInfo(reqParts []string) (*genericrequest.RequestInfo, error) {
|
|
requestInfo := &genericrequest.RequestInfo{
|
|
IsResourceRequest: false,
|
|
Path: strings.Join(reqParts, "/"),
|
|
}
|
|
|
|
if len(reqParts) < 3 {
|
|
// return a non-resource request
|
|
return requestInfo, nil
|
|
}
|
|
|
|
if !apiPrefixes.Has(reqParts[0]) {
|
|
// return a non-resource request
|
|
return requestInfo, nil
|
|
}
|
|
|
|
requestInfo.APIPrefix = reqParts[0]
|
|
currentParts := reqParts[1:]
|
|
|
|
if !groupLessAPIPrefixes.Has(requestInfo.APIPrefix) {
|
|
if len(currentParts) < 3 {
|
|
// return a non-resource request
|
|
return requestInfo, nil
|
|
}
|
|
|
|
requestInfo.APIGroup = currentParts[0]
|
|
currentParts = currentParts[1:]
|
|
}
|
|
|
|
requestInfo.IsResourceRequest = true
|
|
requestInfo.APIVersion = currentParts[0]
|
|
currentParts = currentParts[1:]
|
|
|
|
// URL forms: /namespaces/{namespace}/{kind}/*, where parts are adjusted to be relative to kind
|
|
if currentParts[0] == "namespaces" {
|
|
if len(currentParts) > 1 {
|
|
requestInfo.Namespace = currentParts[1]
|
|
if len(currentParts) > 2 {
|
|
currentParts = currentParts[2:]
|
|
}
|
|
}
|
|
} else {
|
|
requestInfo.Namespace = metav1.NamespaceNone
|
|
}
|
|
|
|
switch {
|
|
case len(currentParts) >= 3:
|
|
return nil, fmt.Errorf("invalid request parts(%s) for k8s native request URL", currentParts)
|
|
case len(currentParts) >= 2:
|
|
requestInfo.Name = currentParts[1]
|
|
fallthrough
|
|
case len(currentParts) >= 1:
|
|
requestInfo.Resource = currentParts[0]
|
|
}
|
|
|
|
if requestInfo.Resource == "namespaces" {
|
|
requestInfo.Namespace = ""
|
|
}
|
|
return requestInfo, nil
|
|
}
|