Skip to content

Commit 0c86e9e

Browse files
authored
Merge pull request #9 from kalmhq/sso
Sso
2 parents 7110a97 + 7e65ce3 commit 0c86e9e

51 files changed

Lines changed: 1832 additions & 146 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/handler/handler.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ func (h *ApiHandler) Install(e *echo.Echo) {
118118
//gv1Alpha1WithAuth.GET("/deploykeys", h.todo)
119119
//gv1Alpha1WithAuth.POST("/deploykeys", h.todo)
120120
//gv1Alpha1WithAuth.DELETE("/deploykeys/:name", h.todo)
121+
122+
gv1Alpha1WithAuth.GET("/sso", h.handleListSSOConfig)
123+
gv1Alpha1WithAuth.DELETE("/sso", h.handleDeleteSSOConfig)
124+
gv1Alpha1WithAuth.PUT("/sso", h.handleUpdateSSOConfig)
125+
gv1Alpha1WithAuth.POST("/sso", h.handleCreateSSOConfig)
121126
}
122127

123128
// use user token and permission

api/handler/sso.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package handler
2+
3+
import (
4+
"github.com/kalmhq/kalm/api/resources"
5+
"github.com/labstack/echo/v4"
6+
)
7+
8+
func (h *ApiHandler) handleListSSOConfig(c echo.Context) error {
9+
ssoConfig, err := h.Builder(c).GetSSOConfig()
10+
11+
if err != nil {
12+
return err
13+
}
14+
15+
return c.JSON(200, ssoConfig)
16+
}
17+
18+
func (h *ApiHandler) handleDeleteSSOConfig(c echo.Context) error {
19+
err := h.Builder(c).DeleteSSOConfig()
20+
21+
if err != nil {
22+
return err
23+
}
24+
25+
return c.NoContent(200)
26+
}
27+
28+
func (h *ApiHandler) handleUpdateSSOConfig(c echo.Context) error {
29+
ssoConfig := &resources.SSOConfig{}
30+
31+
if err := c.Bind(ssoConfig); err != nil {
32+
return err
33+
}
34+
35+
ssoConfig, err := h.Builder(c).UpdateSSOConfig(ssoConfig)
36+
37+
if err != nil {
38+
return err
39+
}
40+
41+
return c.JSON(200, ssoConfig)
42+
}
43+
44+
func (h *ApiHandler) handleCreateSSOConfig(c echo.Context) error {
45+
ssoConfig := &resources.SSOConfig{}
46+
47+
if err := c.Bind(ssoConfig); err != nil {
48+
return err
49+
}
50+
51+
ssoConfig, err := h.Builder(c).CreateSSOConfig(ssoConfig)
52+
53+
if err != nil {
54+
return err
55+
}
56+
57+
return c.JSON(201, ssoConfig)
58+
}

api/resources/sso.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package resources
2+
3+
import (
4+
"github.com/kalmhq/kalm/controller/api/v1alpha1"
5+
"github.com/kalmhq/kalm/controller/controllers"
6+
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
7+
"sigs.k8s.io/controller-runtime/pkg/client"
8+
)
9+
10+
type SSOConfigListChannel struct {
11+
List chan []*v1alpha1.SingleSignOnConfig
12+
Error chan error
13+
}
14+
15+
const SSO_NAME = "sso"
16+
17+
func (builder *Builder) GetSSOConfigListChannel(listOptions ...client.ListOption) *SSOConfigListChannel {
18+
channel := &SSOConfigListChannel{
19+
List: make(chan []*v1alpha1.SingleSignOnConfig, 1),
20+
Error: make(chan error, 1),
21+
}
22+
23+
go func() {
24+
var fetched v1alpha1.SingleSignOnConfigList
25+
err := builder.List(&fetched, listOptions...)
26+
27+
if err != nil {
28+
channel.List <- nil
29+
channel.Error <- err
30+
return
31+
}
32+
33+
res := make([]*v1alpha1.SingleSignOnConfig, len(fetched.Items))
34+
35+
for i, ssoConfig := range fetched.Items {
36+
res[i] = &ssoConfig
37+
}
38+
39+
channel.List <- res
40+
channel.Error <- err
41+
}()
42+
43+
return channel
44+
}
45+
46+
type SSOConfig struct {
47+
*v1alpha1.SingleSignOnConfigSpec `json:",inline"`
48+
}
49+
50+
func (builder *Builder) GetSSOConfig() (*SSOConfig, error) {
51+
var ssoConfig v1alpha1.SingleSignOnConfig
52+
53+
if err := builder.Get(controllers.KALM_DEX_NAMESPACE, SSO_NAME, &ssoConfig); err != nil {
54+
return nil, client.IgnoreNotFound(err)
55+
}
56+
57+
return BuildSSOConfigFromResource(&ssoConfig), nil
58+
}
59+
60+
func BuildSSOConfigFromResource(ssoConfig *v1alpha1.SingleSignOnConfig) *SSOConfig {
61+
return &SSOConfig{
62+
&ssoConfig.Spec,
63+
}
64+
}
65+
66+
func (builder *Builder) CreateSSOConfig(ssoConfig *SSOConfig) (*SSOConfig, error) {
67+
sso := &v1alpha1.SingleSignOnConfig{
68+
ObjectMeta: metaV1.ObjectMeta{
69+
Name: SSO_NAME,
70+
Namespace: controllers.KALM_DEX_NAMESPACE,
71+
},
72+
Spec: *ssoConfig.SingleSignOnConfigSpec,
73+
}
74+
75+
if err := builder.Create(sso); err != nil {
76+
return nil, err
77+
}
78+
79+
return BuildSSOConfigFromResource(sso), nil
80+
}
81+
82+
func (builder *Builder) UpdateSSOConfig(ssoConfig *SSOConfig) (*SSOConfig, error) {
83+
sso := &v1alpha1.SingleSignOnConfig{}
84+
85+
if err := builder.Get(controllers.KALM_DEX_NAMESPACE, SSO_NAME, sso); err != nil {
86+
return nil, err
87+
}
88+
89+
sso.Spec = *ssoConfig.SingleSignOnConfigSpec
90+
91+
if err := builder.Update(sso); err != nil {
92+
return nil, err
93+
}
94+
95+
return BuildSSOConfigFromResource(sso), nil
96+
}
97+
98+
func (builder *Builder) DeleteSSOConfig() error {
99+
return builder.Delete(&v1alpha1.SingleSignOnConfig{ObjectMeta: metaV1.ObjectMeta{Name: SSO_NAME, Namespace: controllers.KALM_DEX_NAMESPACE}})
100+
}

api/ws/watcher.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ func StartWatching(c *Client) {
3030
registerWatchHandler(c, &informerCache, &v1alpha1.HttpsCert{}, buildHttpsCertResMessage)
3131
registerWatchHandler(c, &informerCache, &v1alpha1.DockerRegistry{}, buildRegistryResMessage)
3232
registerWatchHandler(c, &informerCache, &coreV1.PersistentVolumeClaim{}, buildVolumeResMessage)
33+
registerWatchHandler(c, &informerCache, &v1alpha1.SingleSignOnConfig{}, buildSSOConfigResMessage)
3334

3435
informerCache.Start(c.StopWatcher)
3536
}
@@ -258,3 +259,28 @@ func buildVolumeResMessage(c *Client, action string, objWatched interface{}) (*R
258259
Data: volume,
259260
}, nil
260261
}
262+
263+
func buildSSOConfigResMessage(c *Client, action string, objWatched interface{}) (*ResMessage, error) {
264+
ssoConfig, ok := objWatched.(*v1alpha1.SingleSignOnConfig)
265+
266+
if !ok {
267+
return nil, errors.New("convert watch obj to SingleSignOnConfig failed")
268+
}
269+
270+
if ssoConfig.Name != resources.SSO_NAME {
271+
// Ignore non SSO_NAME notification
272+
return nil, nil
273+
}
274+
275+
builder := resources.NewBuilder(c.K8sClientset, c.K8SClientConfig, log.New())
276+
ssoConfigRes, err := builder.GetSSOConfig()
277+
if err != nil {
278+
return nil, err
279+
}
280+
281+
return &ResMessage{
282+
Kind: "SingleSignOnConfig",
283+
Action: action,
284+
Data: ssoConfigRes,
285+
}, nil
286+
}

codecov.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ignore:
2+
- "controller/api"

controller/api/v1alpha1/singlesignonconfig_types.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,13 @@ type ExtAuthzEndpoint struct {
2727
}
2828

2929
type DexConnector struct {
30-
Type string `json:"type"`
31-
ID string `json:"id"`
32-
Name string `json:"name"`
30+
// +kubebuilder:validation:Required
31+
Type string `json:"type"`
32+
// +kubebuilder:validation:Required
33+
ID string `json:"id"`
34+
// +kubebuilder:validation:Required
35+
Name string `json:"name"`
36+
// +kubebuilder:validation:Required
3337
Config *runtime.RawExtension `json:"config"`
3438
}
3539

0 commit comments

Comments
 (0)