Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 0 additions & 36 deletions pkg/cmd/server/origin/master.go
Original file line number Diff line number Diff line change
Expand Up @@ -528,8 +528,6 @@ func (c *MasterConfig) Run(protected []APIInstaller, unprotected []APIInstaller)
go util.Forever(func() {
c.ensureOpenShiftSharedResourcesNamespace()
}, 10*time.Second)

c.checkProjectRequestTemplate()
}

func (c *MasterConfig) defaultAPIGroupVersion() *apiserver.APIGroupVersion {
Expand Down Expand Up @@ -586,40 +584,6 @@ func (c *MasterConfig) getRequestContextMapper() kapi.RequestContextMapper {
return c.RequestContextMapper
}

// checkProjectRequestTemplate looks to see if there should be a projectrequest template. If there should be one and it's not present
func (c *MasterConfig) checkProjectRequestTemplate() {
if len(c.Options.ProjectRequestConfig.ProjectRequestTemplate) == 0 {
return
}

const baseErrorFormat = "Error creating default project request template %v. Unprivileged project requests will fail until a template is available."

namespace, templateName, err := configapi.ParseNamespaceAndName(c.Options.ProjectRequestConfig.ProjectRequestTemplate)
if err != nil {
glog.Errorf(baseErrorFormat+" Caused by: %v", c.Options.ProjectRequestConfig.ProjectRequestTemplate, err)
return
}
if len(namespace) == 0 {
glog.Errorf(baseErrorFormat+" The namespace for the project request template may not be empty.", c.Options.ProjectRequestConfig.ProjectRequestTemplate)
return
}
if len(templateName) == 0 {
glog.Errorf(baseErrorFormat+" The name for the project request template may not be empty.", c.Options.ProjectRequestConfig.ProjectRequestTemplate)
return
}

// if the template already exists, no work to do
if _, err := c.PrivilegedLoopbackOpenShiftClient.Templates(namespace).Get(templateName); err == nil {
return
}

template := projectrequeststorage.NewSampleTemplate(namespace, templateName)
if _, err := c.PrivilegedLoopbackOpenShiftClient.Templates(namespace).Create(template); err != nil {
glog.Errorf(baseErrorFormat+" Caused by: %v", c.Options.ProjectRequestConfig.ProjectRequestTemplate, err)
return
}
}

// ensureOpenShiftSharedResourcesNamespace is called as part of global policy initialization to ensure shared namespace exists
func (c *MasterConfig) ensureOpenShiftSharedResourcesNamespace() {
namespace, err := c.KubeClient().Namespaces().Get(c.Options.PolicyConfig.OpenShiftSharedResourcesNamespace)
Expand Down
4 changes: 1 addition & 3 deletions pkg/cmd/server/start/master_args.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,7 @@ func (args MasterArgs) BuildSerializeableMasterConfig() (*configapi.MasterConfig
Latest: args.ImageFormatArgs.ImageTemplate.Latest,
},

ProjectRequestConfig: configapi.ProjectRequestConfig{
ProjectRequestTemplate: bootstrappolicy.DefaultOpenShiftSharedResourcesNamespace + "/project-request",
},
ProjectRequestConfig: configapi.ProjectRequestConfig{},

NetworkConfig: configapi.NetworkConfig{
NetworkPluginName: args.NetworkArgs.NetworkPluginName,
Expand Down
16 changes: 11 additions & 5 deletions pkg/project/registry/projectrequest/delegated/delegated.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
configcmd "github.com/openshift/origin/pkg/config/cmd"
projectapi "github.com/openshift/origin/pkg/project/api"
projectrequestregistry "github.com/openshift/origin/pkg/project/registry/projectrequest"
templateapi "github.com/openshift/origin/pkg/template/api"
)

type REST struct {
Expand Down Expand Up @@ -48,9 +49,6 @@ func (r *REST) NewList() runtime.Object {
}

func (r *REST) Create(ctx kapi.Context, obj runtime.Object) (runtime.Object, error) {
if len(r.openshiftNamespace) == 0 || len(r.templateName) == 0 {
return nil, errors.New("this endpoint is disabled")
}

if err := rest.BeforeCreate(projectrequestregistry.Strategy, ctx, obj); err != nil {
return nil, err
Expand Down Expand Up @@ -78,7 +76,7 @@ func (r *REST) Create(ctx kapi.Context, obj runtime.Object) (runtime.Object, err
projectAdmin = userInfo.GetName()
}

template, err := r.openshiftClient.Templates(r.openshiftNamespace).Get(r.templateName)
template, err := r.getTemplate()
if err != nil {
return nil, err
}
Expand All @@ -96,7 +94,7 @@ func (r *REST) Create(ctx kapi.Context, obj runtime.Object) (runtime.Object, err
}
}

list, err := r.openshiftClient.TemplateConfigs(r.openshiftNamespace).Create(template)
list, err := r.openshiftClient.TemplateConfigs(kapi.NamespaceDefault).Create(template)
if err != nil {
return nil, err
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm confused... this is submitting the template to the server to process? It doesn't actually persist anything, right? Does it matter what namespace we submit to as long as it exists?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm confused... this is submitting the template to the server to process? It doesn't actually persist anything, right? Does it matter what namespace we submit to as long as it exists?

Correct on all counts and we happen to have a namespace that always exists.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought the namespace you submitted to showed up in the objects in the resulting list... guess not

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought the namespace you submitted to showed up in the objects in the resulting list... guess not

Nope. I think they really wanted to have both namespaced and non-namespaced templates, but couldn't actually do that.

}
Expand All @@ -118,6 +116,14 @@ func (r *REST) Create(ctx kapi.Context, obj runtime.Object) (runtime.Object, err
return r.openshiftClient.Projects().Get(projectName)
}

func (r *REST) getTemplate() (*templateapi.Template, error) {
if len(r.openshiftNamespace) == 0 || len(r.templateName) == 0 {
return DefaultTemplate(), nil
}

return r.openshiftClient.Templates(r.openshiftNamespace).Get(r.templateName)
}

func (r *REST) List(ctx kapi.Context, label labels.Selector, field fields.Selector) (runtime.Object, error) {
userInfo, exists := kapi.UserFrom(ctx)
if !exists {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package delegated

import (
kapi "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"

authorizationapi "github.com/openshift/origin/pkg/authorization/api"

"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
projectapi "github.com/openshift/origin/pkg/project/api"
templateapi "github.com/openshift/origin/pkg/template/api"
Expand All @@ -21,10 +21,10 @@ var (
parameters = []string{ProjectNameParam, ProjectDisplayNameParam, ProjectDescriptionParam, ProjectAdminUserParam}
)

func NewSampleTemplate(openshiftNamespace, templateName string) *templateapi.Template {
func DefaultTemplate() *templateapi.Template {
ret := &templateapi.Template{}
ret.Name = templateName
ret.Namespace = openshiftNamespace
ret.Name = "project-request"
ret.Namespace = kapi.NamespaceDefault

project := &projectapi.Project{}
project.Name = "${" + ProjectNameParam + "}"
Expand Down
96 changes: 86 additions & 10 deletions test/integration/unprivileged_newproject_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package integration

import (
"io/ioutil"
"strings"
"testing"
"time"

Expand All @@ -18,11 +17,13 @@ import (
osc "github.com/openshift/origin/pkg/cmd/cli/cmd"
"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
"github.com/openshift/origin/pkg/cmd/util/tokencmd"
projectapi "github.com/openshift/origin/pkg/project/api"
projectrequeststorage "github.com/openshift/origin/pkg/project/registry/projectrequest/delegated"
testutil "github.com/openshift/origin/test/util"
)

func TestUnprivilegedNewProject(t *testing.T) {
masterConfig, clusterAdminKubeConfig, err := testutil.StartTestMaster()
_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
Expand All @@ -31,10 +32,6 @@ func TestUnprivilegedNewProject(t *testing.T) {
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

valerieClientConfig := *clusterAdminClientConfig
valerieClientConfig.Username = ""
Expand Down Expand Up @@ -80,13 +77,92 @@ func TestUnprivilegedNewProject(t *testing.T) {

waitForProject(t, valerieOpenshiftClient, "new-project", 5*time.Second, 10)

// request the same one again. This should fail during the bulk creation step
if err := requestProject.Run(); err == nil || !strings.Contains(err.Error(), "already exists") {
if err := requestProject.Run(); !kapierrors.IsAlreadyExists(err) {
t.Fatalf("expected an already exists error, but got %v", err)
}

tokens := strings.Split(masterConfig.ProjectRequestConfig.ProjectRequestTemplate, "/")
if err := clusterAdminClient.Templates(tokens[0]).Delete(tokens[1]); err != nil {
}
func TestUnprivilegedNewProjectFromTemplate(t *testing.T) {
namespace := "foo"
templateName := "bar"

masterOptions, err := testutil.DefaultMasterOptions()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
masterOptions.ProjectRequestConfig.ProjectRequestTemplate = namespace + "/" + templateName

clusterAdminKubeConfig, err := testutil.StartConfiguredMaster(masterOptions)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

clusterAdminClientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

valerieClientConfig := *clusterAdminClientConfig
valerieClientConfig.Username = ""
valerieClientConfig.Password = ""
valerieClientConfig.BearerToken = ""
valerieClientConfig.CertFile = ""
valerieClientConfig.KeyFile = ""
valerieClientConfig.CertData = nil
valerieClientConfig.KeyData = nil

accessToken, err := tokencmd.RequestToken(&valerieClientConfig, nil, "valerie", "security!")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

valerieClientConfig.BearerToken = accessToken
valerieOpenshiftClient, err := client.New(&valerieClientConfig)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

if _, err := clusterAdminClient.Projects().Create(&projectapi.Project{ObjectMeta: kapi.ObjectMeta{Name: namespace}}); err != nil {
t.Fatalf("unexpected error: %v", err)
}

template := projectrequeststorage.DefaultTemplate()
template.Name = templateName
template.Namespace = namespace

template.Objects[0].(*projectapi.Project).Annotations["extra"] = "here"
_, err = clusterAdminClient.Templates(namespace).Create(template)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

requestProject := osc.NewProjectOptions{
ProjectName: "new-project",
DisplayName: "display name here",
Description: "the special description",

Client: valerieOpenshiftClient,
Out: ioutil.Discard,
}

if err := requestProject.Run(); err != nil {
t.Fatalf("unexpected error: %v", err)
}

waitForProject(t, valerieOpenshiftClient, "new-project", 5*time.Second, 10)
project, err := valerieOpenshiftClient.Projects().Get("new-project")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if project.Annotations["extra"] != "here" {
t.Errorf("unexpected project %#v", project)
}

if err := clusterAdminClient.Templates(namespace).Delete(templateName); err != nil {
t.Fatalf("unexpected error: %v", err)
}

Expand Down