syncer/service/replicator/resource/role.go (114 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package resource import ( "context" "errors" "fmt" "github.com/apache/servicecomb-service-center/datasource/rbac" "github.com/apache/servicecomb-service-center/pkg/log" v1sync "github.com/apache/servicecomb-service-center/syncer/api/v1" crbac "github.com/go-chassis/cari/rbac" ) const ( Role = "role" ) func NewRole(e *v1sync.Event) Resource { r := &role{ event: e, } r.manager = r return r } type role struct { event *v1sync.Event input *crbac.Role deleteInput *string roleName string cur *crbac.Role manager roleManager defaultFailHandler } type roleManager interface { GetRole(ctx context.Context, name string) (*crbac.Role, error) EditRole(ctx context.Context, name string, r *crbac.Role) error CreateRole(ctx context.Context, r *crbac.Role) error DeleteRole(ctx context.Context, name string) error } func (r *role) loadInput() error { r.input = new(crbac.Role) callback := func() { r.roleName = r.input.Name } r.deleteInput = new(string) createOrUpdateParam := newInputParam(r.input, callback) deleteParam := newInputParam(r.deleteInput, func() { r.roleName = *r.deleteInput }) return newInputLoader( r.event, createOrUpdateParam, createOrUpdateParam, deleteParam, ).loadInput() } func (r *role) LoadCurrentResource(ctx context.Context) *Result { err := r.loadInput() if err != nil { return FailResult(err) } cur, err := r.manager.GetRole(ctx, r.roleName) if err != nil { if errors.Is(err, rbac.ErrRoleNotExist) { return nil } return FailResult(err) } r.cur = cur return nil } func (r *role) NeedOperate(ctx context.Context) *Result { checker := &checker{ curNotNil: r.cur != nil, event: r.event, updateTime: func() (int64, error) { return formatUpdateTimeSecond(r.cur.UpdateTime) }, resourceID: r.input.Name, } checker.tombstoneLoader = checker return checker.needOperate(ctx) } func (r *role) CreateHandle(ctx context.Context) error { if r.cur != nil { log.Warn(fmt.Sprintf("create action but resource exist, %s, %s", r.roleName, r.event.Id)) return r.UpdateHandle(ctx) } return r.manager.CreateRole(ctx, r.input) } func (r *role) UpdateHandle(ctx context.Context) error { if r.cur == nil { log.Warn(fmt.Sprintf("update action but resource not exist, %s, %s", r.roleName, r.event.Id)) return r.CreateHandle(ctx) } return r.manager.EditRole(ctx, r.roleName, r.input) } func (r *role) DeleteHandle(ctx context.Context) error { return r.manager.DeleteRole(ctx, r.roleName) } func (r *role) Operate(ctx context.Context) *Result { return newOperator(r).operate(ctx, r.event.Action) } func (r *role) GetRole(ctx context.Context, name string) (*crbac.Role, error) { return rbac.Instance().GetRole(ctx, name) } func (r *role) EditRole(ctx context.Context, name string, role *crbac.Role) error { return rbac.Instance().UpdateRole(ctx, name, role) } func (r *role) CreateRole(ctx context.Context, role *crbac.Role) error { return rbac.Instance().CreateRole(ctx, role) } func (r *role) DeleteRole(ctx context.Context, name string) error { _, err := rbac.Instance().DeleteRole(ctx, name) return err }