Skip to content

Commit 4370e46

Browse files
author
Zachary Seguin
committed
feat(namespaces): Add namespaces response
1 parent 42c7019 commit 4370e46

File tree

5 files changed

+80
-12
lines changed

5 files changed

+80
-12
lines changed

access.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ func (s *server) checkAccess(subjectAccessReviewTemplate authorizationv1.Subject
5757
}
5858

5959
// Update the SubjectAccessReview request with the namespace and user information
60-
sar.Spec.ResourceAttributes.Namespace = vars["namespace"]
60+
if namespace, ok := vars["namespace"]; ok {
61+
sar.Spec.ResourceAttributes.Namespace = namespace
62+
} else {
63+
sar.Spec.ResourceAttributes.Namespace = ""
64+
}
6165
sar.Spec.User = user
6266

6367
// Submit the SubjectAccessReview to the Kubernetes API server

listers.go

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,37 @@ func (s *server) setupListers(ctx context.Context) error {
1515
factory := informers.NewSharedInformerFactory(s.clientsets.kubernetes, 5*time.Minute)
1616
kubeflowFactory := kubeflowinformers.NewSharedInformerFactory(s.clientsets.kubeflow, time.Minute*5)
1717

18+
// Namespaces
19+
namespacesInformer := factory.Core().V1().Namespaces()
20+
s.listers.namespaces = namespacesInformer.Lister()
21+
1822
// Events
1923
eventsInformer := factory.Core().V1().Events()
20-
go eventsInformer.Informer().Run(ctx.Done())
21-
2224
s.listers.events = eventsInformer.Lister()
2325

2426
// StorageClasses
2527
storageClassesInformer := factory.Storage().V1().StorageClasses()
26-
go storageClassesInformer.Informer().Run(ctx.Done())
27-
2828
s.listers.storageClasses = storageClassesInformer.Lister()
2929

3030
// PersistentVolumeClaims
3131
pvcInformer := factory.Core().V1().PersistentVolumeClaims()
32-
go pvcInformer.Informer().Run(ctx.Done())
33-
3432
s.listers.persistentVolumeClaims = pvcInformer.Lister()
3533

3634
// PodDefaults
3735
podDefaultsInformer := kubeflowFactory.Kubeflow().V1alpha1().PodDefaults()
38-
go podDefaultsInformer.Informer().Run(ctx.Done())
39-
4036
s.listers.podDefaults = podDefaultsInformer.Lister()
4137

4238
// Notebooks
4339
notebooksInformer := kubeflowFactory.Kubeflow().V1().Notebooks()
44-
go notebooksInformer.Informer().Run(ctx.Done())
45-
4640
s.listers.notebooks = notebooksInformer.Lister()
4741

42+
go factory.Start(ctx.Done())
43+
go kubeflowFactory.Start(ctx.Done())
44+
4845
// Wait until sync
4946
log.Printf("synching caches...")
5047
tctx, _ := context.WithTimeout(ctx, time.Minute)
51-
if !cache.WaitForCacheSync(tctx.Done(), eventsInformer.Informer().HasSynced, storageClassesInformer.Informer().HasSynced, pvcInformer.Informer().HasSynced, podDefaultsInformer.Informer().HasSynced, notebooksInformer.Informer().HasSynced) {
48+
if !cache.WaitForCacheSync(tctx.Done(), namespacesInformer.Informer().HasSynced, eventsInformer.Informer().HasSynced, storageClassesInformer.Informer().HasSynced, pvcInformer.Informer().HasSynced, podDefaultsInformer.Informer().HasSynced, notebooksInformer.Informer().HasSynced) {
5249
return fmt.Errorf("timeout synching caches")
5350
}
5451
log.Printf("done synching caches")

main.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ var userIDHeader string
3535
var staticDirectory string
3636

3737
type listers struct {
38+
namespaces v1listers.NamespaceLister
3839
events v1listers.EventLister
3940
storageClasses storagev1listers.StorageClassLister
4041
persistentVolumeClaims v1listers.PersistentVolumeClaimLister
@@ -117,8 +118,19 @@ func main() {
117118

118119
// Setup route handlers
119120
router.HandleFunc("/api/config", s.GetConfig).Methods("GET")
121+
120122
router.HandleFunc("/api/storageclasses/default", s.GetDefaultStorageClass).Methods("GET")
121123

124+
router.HandleFunc("/api/namespaces", s.checkAccess(authorizationv1.SubjectAccessReview{
125+
Spec: authorizationv1.SubjectAccessReviewSpec{
126+
ResourceAttributes: &authorizationv1.ResourceAttributes{
127+
Group: corev1.SchemeGroupVersion.Group,
128+
Verb: "list",
129+
Resource: "namespaces",
130+
Version: corev1.SchemeGroupVersion.Version,
131+
},
132+
},
133+
}, s.GetNamespaces)).Methods("GET")
122134
router.HandleFunc("/api/namespaces/{namespace}/notebooks", s.checkAccess(authorizationv1.SubjectAccessReview{
123135
Spec: authorizationv1.SubjectAccessReviewSpec{
124136
ResourceAttributes: &authorizationv1.ResourceAttributes{

namespaces.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"net/http"
6+
"sort"
7+
8+
"k8s.io/apimachinery/pkg/labels"
9+
)
10+
11+
type namespacesresponse struct {
12+
APIResponse
13+
Namespaces []string `json:"namespaces"`
14+
}
15+
16+
// GetNamespaces returns the namespaces in the environment.
17+
func (s *server) GetNamespaces(w http.ResponseWriter, r *http.Request) {
18+
log.Printf("loading namespaces")
19+
20+
namespaces, err := s.listers.namespaces.List(labels.Everything())
21+
if err != nil {
22+
s.error(w, r, err)
23+
return
24+
}
25+
26+
sort.Sort(namespacesByName(namespaces))
27+
28+
resp := namespacesresponse{
29+
APIResponse: APIResponse{
30+
Success: true,
31+
},
32+
Namespaces: make([]string, 0),
33+
}
34+
35+
for _, namespace := range namespaces {
36+
resp.Namespaces = append(resp.Namespaces, namespace.Name)
37+
}
38+
39+
s.respond(w, r, resp)
40+
}

sort.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,18 @@ func (pvcs persistentVolumeClaimsByName) Less(a, b int) bool {
4949
func (pvcs persistentVolumeClaimsByName) Swap(a, b int) {
5050
pvcs[a], pvcs[b] = pvcs[b], pvcs[a]
5151
}
52+
53+
// Namespaces by Name
54+
type namespacesByName []*corev1.Namespace
55+
56+
func (namespaces namespacesByName) Len() int {
57+
return len(namespaces)
58+
}
59+
60+
func (namespaces namespacesByName) Less(a, b int) bool {
61+
return namespaces[a].Name < namespaces[b].Name
62+
}
63+
64+
func (namespaces namespacesByName) Swap(a, b int) {
65+
namespaces[a], namespaces[b] = namespaces[b], namespaces[a]
66+
}

0 commit comments

Comments
 (0)