pkg/cmd/cli/cmd/request_project.go
c9a6ebf8
 package cmd
 
 import (
2da2b953
 	"errors"
c9a6ebf8
 	"fmt"
 	"io"
 
 	"github.com/spf13/cobra"
 
83c702b4
 	"k8s.io/kubernetes/pkg/fields"
 	kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
 	"k8s.io/kubernetes/pkg/labels"
2da2b953
 
c9a6ebf8
 	"github.com/openshift/origin/pkg/client"
2da2b953
 	cliconfig "github.com/openshift/origin/pkg/cmd/cli/config"
c9a6ebf8
 	"github.com/openshift/origin/pkg/cmd/util/clientcmd"
 	projectapi "github.com/openshift/origin/pkg/project/api"
 )
 
 type NewProjectOptions struct {
d2fe5ca0
 	ProjectName string
 	DisplayName string
 	Description string
c9a6ebf8
 
 	Client client.Interface
2da2b953
 
 	ProjectOptions *ProjectOptions
 	Out            io.Writer
c9a6ebf8
 }
 
1558f2d9
 const (
c124965f
 	requestProjectLong = `
c3e1dbba
 Create a new project for yourself
c9a6ebf8
 
c124965f
 Assuming your cluster admin has granted you permission, this command will create a new project
 for you and assign you as the project admin. If your administrator has not given you permission to
 create your own projects, contact your system administrator.
c9a6ebf8
 
c124965f
 After your project is created it will be made your default project in your config.`
c9a6ebf8
 
c36413f1
 	requestProjectExample = `  // Create a new project with minimal information
14c0fea1
   $ %[1]s web-team-dev
c9a6ebf8
 
903f2626
   // Create a new project with a display name and description
   $ %[1]s web-team-dev --display-name="Web Team Development" --description="Development project for the web team."`
1558f2d9
 )
c9a6ebf8
 
 func NewCmdRequestProject(name, fullName, oscLoginName, oscProjectName string, f *clientcmd.Factory, out io.Writer) *cobra.Command {
 	options := &NewProjectOptions{}
2da2b953
 	options.Out = out
c9a6ebf8
 
 	cmd := &cobra.Command{
903f2626
 		Use:     fmt.Sprintf("%s NAME [--display-name=DISPLAYNAME] [--description=DESCRIPTION]", name),
1558f2d9
 		Short:   "Request a new project",
c36413f1
 		Long:    fmt.Sprintf(requestProjectLong, oscLoginName, oscProjectName),
 		Example: fmt.Sprintf(requestProjectExample, fullName),
c9a6ebf8
 		Run: func(cmd *cobra.Command, args []string) {
2da2b953
 			if err := options.complete(cmd, f); err != nil {
 				kcmdutil.CheckErr(err)
c9a6ebf8
 			}
 
 			var err error
 			if options.Client, _, err = f.Clients(); err != nil {
2da2b953
 				kcmdutil.CheckErr(err)
c9a6ebf8
 			}
 			if err := options.Run(); err != nil {
2da2b953
 				kcmdutil.CheckErr(err)
c9a6ebf8
 			}
 		},
 	}
 
903f2626
 	cmd.Flags().StringVar(&options.DisplayName, "display-name", "", "Project display name")
 	cmd.Flags().StringVar(&options.Description, "description", "", "Project description")
c9a6ebf8
 
 	return cmd
 }
 
2da2b953
 func (o *NewProjectOptions) complete(cmd *cobra.Command, f *clientcmd.Factory) error {
c9a6ebf8
 	args := cmd.Flags().Args()
 	if len(args) != 1 {
 		cmd.Help()
2da2b953
 		return errors.New("must have exactly one argument")
c9a6ebf8
 	}
 
 	o.ProjectName = args[0]
 
2da2b953
 	o.ProjectOptions = &ProjectOptions{}
 	o.ProjectOptions.PathOptions = cliconfig.NewPathOptions(cmd)
 	if err := o.ProjectOptions.Complete(f, []string{""}, o.Out); err != nil {
 		return err
 	}
 
 	return nil
c9a6ebf8
 }
 
 func (o *NewProjectOptions) Run() error {
c8ffe32a
 	// TODO eliminate this when we get better forbidden messages
 	_, err := o.Client.ProjectRequests().List(labels.Everything(), fields.Everything())
 	if err != nil {
 		return err
 	}
 
c9a6ebf8
 	projectRequest := &projectapi.ProjectRequest{}
 	projectRequest.Name = o.ProjectName
 	projectRequest.DisplayName = o.DisplayName
a1a1e760
 	projectRequest.Description = o.Description
c9a6ebf8
 	projectRequest.Annotations = make(map[string]string)
2da2b953
 
 	project, err := o.Client.ProjectRequests().Create(projectRequest)
 	if err != nil {
c9a6ebf8
 		return err
 	}
 
2da2b953
 	if o.ProjectOptions != nil {
 		o.ProjectOptions.ProjectName = project.Name
 		o.ProjectOptions.ProjectOnly = true
 
 		if err := o.ProjectOptions.RunProject(); err != nil {
 			return err
 		}
 	}
 
c9a6ebf8
 	return nil
 }