2020-03-12 20:14:47 +00:00
|
|
|
package userpreferences
|
|
|
|
|
|
|
|
import (
|
2020-06-12 04:50:59 +00:00
|
|
|
"github.com/rancher/apiserver/pkg/store/empty"
|
|
|
|
"github.com/rancher/apiserver/pkg/types"
|
2020-06-06 00:19:07 +00:00
|
|
|
"github.com/rancher/norman/types/convert"
|
2020-06-12 04:50:59 +00:00
|
|
|
"github.com/rancher/steve/pkg/stores/proxy"
|
2020-03-12 20:14:47 +00:00
|
|
|
"github.com/rancher/wrangler/pkg/schemas/validation"
|
2020-06-06 00:19:07 +00:00
|
|
|
corev1 "k8s.io/api/core/v1"
|
2020-03-12 20:14:47 +00:00
|
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
2020-06-06 00:19:07 +00:00
|
|
|
"k8s.io/apiserver/pkg/authentication/user"
|
|
|
|
v1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
2020-03-12 20:14:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type configMapStore struct {
|
|
|
|
empty.Store
|
|
|
|
cg proxy.ClientGetter
|
|
|
|
}
|
|
|
|
|
2020-06-06 00:19:07 +00:00
|
|
|
func (e *configMapStore) getClient(apiOp *types.APIRequest) (v1.ConfigMapInterface, error) {
|
|
|
|
c, err := e.cg.AdminK8sInterface()
|
2020-03-12 20:14:47 +00:00
|
|
|
if err != nil {
|
2020-06-06 00:19:07 +00:00
|
|
|
return nil, err
|
2020-03-12 20:14:47 +00:00
|
|
|
}
|
2020-06-06 00:19:07 +00:00
|
|
|
return c.CoreV1().ConfigMaps("kube-system"), nil
|
|
|
|
}
|
2020-03-12 20:14:47 +00:00
|
|
|
|
2020-06-06 00:19:07 +00:00
|
|
|
func newPref(u user.Info) (types.APIObject, *UserPreference) {
|
2020-03-12 20:14:47 +00:00
|
|
|
pref := &UserPreference{
|
|
|
|
Data: map[string]string{},
|
|
|
|
}
|
2020-06-06 00:19:07 +00:00
|
|
|
return types.APIObject{
|
2020-03-12 20:14:47 +00:00
|
|
|
Type: "userpreference",
|
|
|
|
ID: u.GetName(),
|
|
|
|
Object: pref,
|
2020-06-06 00:19:07 +00:00
|
|
|
}, pref
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *configMapStore) ByID(apiOp *types.APIRequest, schema *types.APISchema, id string) (types.APIObject, error) {
|
|
|
|
u := getUser(apiOp)
|
|
|
|
result, pref := newPref(u)
|
|
|
|
|
|
|
|
client, err := e.getClient(apiOp)
|
|
|
|
if err == validation.NotFound {
|
|
|
|
return result, nil
|
|
|
|
} else if err != nil {
|
|
|
|
return types.APIObject{}, err
|
2020-03-12 20:14:47 +00:00
|
|
|
}
|
|
|
|
|
2020-03-26 20:58:39 +00:00
|
|
|
obj, err := client.Get(apiOp.Context(), prefName(u), metav1.GetOptions{})
|
2020-03-12 20:14:47 +00:00
|
|
|
if apierrors.IsNotFound(err) {
|
|
|
|
return result, nil
|
|
|
|
}
|
|
|
|
|
2020-06-06 00:19:07 +00:00
|
|
|
pref.Data = obj.Data
|
|
|
|
return result, nil
|
2020-03-12 20:14:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (e *configMapStore) List(apiOp *types.APIRequest, schema *types.APISchema) (types.APIObjectList, error) {
|
|
|
|
obj, err := e.ByID(apiOp, schema, "")
|
|
|
|
if err != nil {
|
|
|
|
return types.APIObjectList{}, err
|
|
|
|
}
|
|
|
|
return types.APIObjectList{
|
|
|
|
Objects: []types.APIObject{
|
|
|
|
obj,
|
|
|
|
},
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *configMapStore) Update(apiOp *types.APIRequest, schema *types.APISchema, data types.APIObject, id string) (types.APIObject, error) {
|
|
|
|
u := getUser(apiOp)
|
|
|
|
client, err := e.getClient(apiOp)
|
|
|
|
if err != nil {
|
|
|
|
return types.APIObject{}, err
|
|
|
|
}
|
|
|
|
|
2020-06-06 00:19:07 +00:00
|
|
|
values := map[string]string{}
|
|
|
|
for k, v := range data.Data().Map("data") {
|
|
|
|
values[k] = convert.ToString(v)
|
|
|
|
}
|
|
|
|
|
2020-03-26 20:58:39 +00:00
|
|
|
obj, err := client.Get(apiOp.Context(), prefName(u), metav1.GetOptions{})
|
2020-03-12 20:14:47 +00:00
|
|
|
if apierrors.IsNotFound(err) {
|
2020-06-06 00:19:07 +00:00
|
|
|
_, err = client.Create(apiOp.Context(), &corev1.ConfigMap{
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
Name: prefName(u),
|
2020-03-12 20:14:47 +00:00
|
|
|
},
|
2020-06-06 00:19:07 +00:00
|
|
|
Data: values,
|
2020-03-12 20:14:47 +00:00
|
|
|
}, metav1.CreateOptions{})
|
|
|
|
} else if err == nil {
|
2020-06-06 00:19:07 +00:00
|
|
|
obj.Data = values
|
2020-03-26 20:58:39 +00:00
|
|
|
_, err = client.Update(apiOp.Context(), obj, metav1.UpdateOptions{})
|
2020-03-12 20:14:47 +00:00
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
return types.APIObject{}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return e.ByID(apiOp, schema, "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *configMapStore) Delete(apiOp *types.APIRequest, schema *types.APISchema, id string) (types.APIObject, error) {
|
|
|
|
u := getUser(apiOp)
|
|
|
|
client, err := e.getClient(apiOp)
|
|
|
|
if err != nil {
|
|
|
|
return types.APIObject{}, err
|
|
|
|
}
|
|
|
|
|
2020-03-26 20:58:39 +00:00
|
|
|
return types.APIObject{}, client.Delete(apiOp.Context(), prefName(u), metav1.DeleteOptions{})
|
2020-03-12 20:14:47 +00:00
|
|
|
}
|