// Authorizer implements authorizer.Authorize func (ka *keystoneAuthorizer) Authorize(a authorizer.Attributes) (string, error) { var ( tenantName string ns *api.Namespace err error ) if a.GetNamespace() != "" { ns, err = ka.kubeClient.Namespaces().Get(a.GetNamespace()) if err != nil { return "", err } tenantName = ns.Tenant } else { if a.GetTenant() != "" { te, err := ka.kubeClient.Tenants().Get(a.GetTenant()) if err != nil { return "", err } tenantName = te.Name } } if authorizer.IsWhiteListedUser(a.GetUserName()) { if a.GetUserName() != api.UserAdmin { return tenantName, nil } else { return api.TenantDefault, nil } } else { if !a.IsReadOnly() && a.GetResource() == "tenants" { return "", errors.New("only admin can write tenant") } } authConfig := &authConfig{ AuthUrl: ka.authUrl, Username: a.GetUserName(), Password: a.GetPassword(), } osClient, err := newOpenstackClient(authConfig) if err != nil { glog.Errorf("%v", err) return "", err } tenant, err := osClient.getTenant() if err != nil { glog.Errorf("%v", err) return "", err } if tenantName == "" || tenantName == tenant.Name { return tenant.Name, nil } return "", errors.New("Keystone authorization failed") }