forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
namespace_policy.go
96 lines (80 loc) · 3.87 KB
/
namespace_policy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package bootstrappolicy
import (
"strings"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/apis/rbac"
"github.com/golang/glog"
)
func addNamespaceRole(namespaceRoles map[string][]rbac.Role, namespace string, role rbac.Role) {
if namespace != "openshift" && !strings.HasPrefix(namespace, "openshift-") {
glog.Fatalf(`roles can only be bootstrapped into reserved "openshift" namespace or namespaces starting with "openshift-", not %q`, namespace)
}
existingRoles := namespaceRoles[namespace]
for _, existingRole := range existingRoles {
if role.Name == existingRole.Name {
glog.Fatalf("role %q was already registered in %q", role.Name, namespace)
}
}
role.Namespace = namespace
addDefaultMetadata(&role)
existingRoles = append(existingRoles, role)
namespaceRoles[namespace] = existingRoles
}
func addNamespaceRoleBinding(namespaceRoleBindings map[string][]rbac.RoleBinding, namespace string, roleBinding rbac.RoleBinding) {
if namespace != "openshift" && !strings.HasPrefix(namespace, "openshift-") {
glog.Fatalf(`role bindings can only be bootstrapped into reserved "openshift" namespace or namespaces starting with "openshift-", not %q`, namespace)
}
existingRoleBindings := namespaceRoleBindings[namespace]
for _, existingRoleBinding := range existingRoleBindings {
if roleBinding.Name == existingRoleBinding.Name {
glog.Fatalf("rolebinding %q was already registered in %q", roleBinding.Name, namespace)
}
}
roleBinding.Namespace = namespace
addDefaultMetadata(&roleBinding)
existingRoleBindings = append(existingRoleBindings, roleBinding)
namespaceRoleBindings[namespace] = existingRoleBindings
}
func buildNamespaceRolesAndBindings() (map[string][]rbac.Role, map[string][]rbac.RoleBinding) {
// namespaceRoles is a map of namespace to slice of roles to create
namespaceRoles := map[string][]rbac.Role{}
// namespaceRoleBindings is a map of namespace to slice of roleBindings to create
namespaceRoleBindings := map[string][]rbac.RoleBinding{}
addNamespaceRole(namespaceRoles,
DefaultOpenShiftSharedResourcesNamespace,
rbac.Role{
ObjectMeta: metav1.ObjectMeta{Name: OpenshiftSharedResourceViewRoleName},
Rules: []rbac.PolicyRule{
rbac.NewRule(read...).Groups(templateGroup, legacyTemplateGroup).Resources("templates").RuleOrDie(),
rbac.NewRule(read...).Groups(imageGroup, legacyImageGroup).Resources("imagestreams", "imagestreamtags", "imagestreamimages").RuleOrDie(),
// so anyone can pull from openshift/* image streams
rbac.NewRule("get").Groups(imageGroup, legacyImageGroup).Resources("imagestreams/layers").RuleOrDie(),
},
})
addNamespaceRoleBinding(namespaceRoleBindings,
DefaultOpenShiftSharedResourcesNamespace,
newOriginRoleBinding(OpenshiftSharedResourceViewRoleBindingName, OpenshiftSharedResourceViewRoleName, DefaultOpenShiftSharedResourcesNamespace).Groups(AuthenticatedGroup).BindingOrDie())
addNamespaceRole(namespaceRoles,
DefaultOpenShiftNodeNamespace,
rbac.Role{
ObjectMeta: metav1.ObjectMeta{Name: NodeConfigReaderRoleName},
Rules: []rbac.PolicyRule{
// Allow the reader to read config maps in a given namespace with a given name.
rbac.NewRule("get").Groups(kapiGroup).Resources("configmaps").RuleOrDie(),
},
})
addNamespaceRoleBinding(namespaceRoleBindings,
DefaultOpenShiftNodeNamespace,
rbac.NewRoleBinding(NodeConfigReaderRoleName, DefaultOpenShiftNodeNamespace).Groups(NodesGroup).BindingOrDie())
return namespaceRoles, namespaceRoleBindings
}
// NamespaceRoles returns a map of namespace to slice of roles to create
func NamespaceRoles() map[string][]rbac.Role {
namespaceRoles, _ := buildNamespaceRolesAndBindings()
return namespaceRoles
}
// NamespaceRoleBindings returns a map of namespace to slice of role bindings to create
func NamespaceRoleBindings() map[string][]rbac.RoleBinding {
_, namespaceRoleBindings := buildNamespaceRolesAndBindings()
return namespaceRoleBindings
}