service/keycloak/service.go (80 lines of code) (raw):
package keycloak
import (
"context"
"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/rest"
"sigs.k8s.io/controller-runtime/pkg/client"
pkgScheme "sigs.k8s.io/controller-runtime/pkg/scheme"
"ddm-admin-console/service"
)
type Service struct {
service.UserConfig
k8sClient client.Client
scheme *runtime.Scheme
namespace string
restConfig *rest.Config
}
func Make(s *runtime.Scheme, k8sConfig *rest.Config, namespace string) (*Service, error) {
builder := pkgScheme.Builder{GroupVersion: schema.GroupVersion{Group: "v1.edp.epam.com", Version: "v1alpha1"}}
builder.Register(&KeycloakRealmUser{}, &KeycloakRealmUserList{})
if err := builder.AddToScheme(s); err != nil {
return nil, errors.Wrap(err, "error during builder add to scheme")
}
cl, err := client.New(k8sConfig, client.Options{
Scheme: s,
})
if err != nil {
return nil, errors.Wrap(err, "unable to init k8s jenkins client")
}
return &Service{
k8sClient: cl,
scheme: s,
namespace: namespace,
UserConfig: service.UserConfig{
RestConfig: k8sConfig,
},
restConfig: k8sConfig,
}, nil
}
func (s *Service) GetUsers(ctx context.Context) ([]KeycloakRealmUser, error) {
var lst KeycloakRealmUserList
if err := s.k8sClient.List(ctx, &lst, &client.ListOptions{
Namespace: s.namespace,
}); err != nil {
return nil, errors.Wrap(err, "unable to list users")
}
return lst.Items, nil
}
func (s *Service) GetUsersByRealm(ctx context.Context, realmName string) ([]KeycloakRealmUser, error) {
usrs, err := s.GetUsers(ctx)
if err != nil {
return nil, errors.Wrap(err, "unable to get users")
}
var filteredUsers []KeycloakRealmUser
for _, u := range usrs {
if u.Spec.Realm == realmName {
filteredUsers = append(filteredUsers, u)
}
}
return filteredUsers, nil
}
func (s *Service) CreateUser(ctx context.Context, user *KeycloakRealmUser) error {
if err := s.k8sClient.Create(ctx, user); err != nil {
return errors.Wrap(err, "unable to create realm user")
}
return nil
}
func (s *Service) UpdateUser(ctx context.Context, user *KeycloakRealmUser) error {
if err := s.k8sClient.Update(ctx, user); err != nil {
return errors.Wrap(err, "unable to update user")
}
return nil
}
func (s *Service) DeleteUser(ctx context.Context, user *KeycloakRealmUser) error {
if err := s.k8sClient.Delete(ctx, user); err != nil {
return errors.Wrap(err, "unable to delete user")
}
return nil
}