feat(business-line): auto bind Wayne namespace on create
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user