feat(business-line): auto bind Wayne namespace on create

This commit is contained in:
mac
2026-07-22 14:59:54 +08:00
parent 7f6f6fa41e
commit d150d0f0dd
3 changed files with 214 additions and 1 deletions
@@ -53,6 +53,13 @@ type WayneRoleGroup struct {
Type int `json:"type"`
}
type WayneNamespace struct {
ID uint64 `json:"id"`
Name string `json:"name"`
KubeNamespace string `json:"kubeNamespace"`
MetaData string `json:"metaData,omitempty"`
}
type WayneOperatorPermissions struct {
Create bool `json:"create"`
Update bool `json:"update"`
@@ -115,6 +122,77 @@ func (s *WayneRoleBindingService) ListNamespaces(ctx context.Context) (*WayneRol
return s.callRaw(ctx, http.MethodGet, "/api/v1/namespaces", nil)
}
func (s *WayneRoleBindingService) EnsureNamespace(ctx context.Context, name string) (*WayneNamespace, error) {
name = strings.TrimSpace(name)
if name == "" {
return nil, fmt.Errorf("wayne namespace name is required")
}
namespace, err := s.FindNamespaceByName(ctx, name)
if err != nil {
return nil, err
}
if namespace != nil {
return namespace, nil
}
return s.CreateNamespace(ctx, WayneNamespace{
Name: name,
KubeNamespace: name,
MetaData: "{}",
})
}
func (s *WayneRoleBindingService) FindNamespaceByName(ctx context.Context, name string) (*WayneNamespace, error) {
name = strings.TrimSpace(name)
if name == "" {
return nil, fmt.Errorf("wayne namespace name is required")
}
values := url.Values{}
values.Set("name", name)
values.Set("pageNo", "1")
values.Set("pageSize", "500")
result, err := s.callRaw(ctx, http.MethodGet, "/api/v1/namespaces?"+values.Encode(), nil)
if err != nil {
return nil, err
}
namespaces, err := parseWayneNamespaces(result.Body)
if err != nil {
return nil, err
}
for _, namespace := range namespaces {
if strings.EqualFold(strings.TrimSpace(namespace.Name), name) {
return &namespace, nil
}
}
return nil, nil
}
func (s *WayneRoleBindingService) CreateNamespace(ctx context.Context, namespace WayneNamespace) (*WayneNamespace, error) {
namespace.Name = strings.TrimSpace(namespace.Name)
namespace.KubeNamespace = strings.TrimSpace(namespace.KubeNamespace)
if namespace.Name == "" {
return nil, fmt.Errorf("wayne namespace name is required")
}
if namespace.KubeNamespace == "" {
namespace.KubeNamespace = namespace.Name
}
if strings.TrimSpace(namespace.MetaData) == "" {
namespace.MetaData = "{}"
}
body, err := json.Marshal(namespace)
if err != nil {
return nil, err
}
result, err := s.callRaw(ctx, http.MethodPost, "/api/v1/namespaces", body)
if err != nil {
return nil, err
}
created, err := parseWayneNamespace(result.Body)
if err != nil {
return nil, err
}
return &created, nil
}
func (s *WayneRoleBindingService) ListGroups(ctx context.Context, groupType *int) (*WayneRoleBindingResult, error) {
path := "/api/v1/groups"
if groupType != nil {
@@ -615,6 +693,28 @@ func parseWayneResourceIDs(body []byte) ([]uint64, error) {
return resourceIDsFromItems(wrapped.Data.List), nil
}
func parseWayneNamespace(body []byte) (WayneNamespace, error) {
var wrapped struct {
Data WayneNamespace `json:"data"`
}
if err := json.Unmarshal(body, &wrapped); err != nil {
return WayneNamespace{}, err
}
return wrapped.Data, nil
}
func parseWayneNamespaces(body []byte) ([]WayneNamespace, error) {
var wrapped struct {
Data struct {
List []WayneNamespace `json:"list"`
} `json:"data"`
}
if err := json.Unmarshal(body, &wrapped); err != nil {
return nil, err
}
return wrapped.Data.List, nil
}
func resourceIDsFromItems(items []struct {
ID uint64 `json:"id"`
}) []uint64 {