package groups
import (
"errors"
"fmt"
"io"
"k8s.io/kubernetes/pkg/kubectl"
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/sets"
"github.com/spf13/cobra"
"github.com/openshift/origin/pkg/client"
"github.com/openshift/origin/pkg/cmd/templates"
"github.com/openshift/origin/pkg/cmd/util/clientcmd"
userapi "github.com/openshift/origin/pkg/user/api"
)
const NewGroupRecommendedName = "new"
var (
newLong = templates.LongDesc(`
Create a new group.
This command will create a new group with an optional list of users.`)
newExample = templates.Examples(`
# Add a group with no users
%[1]s my-group
# Add a group with two users
%[1]s my-group user1 user2
# Add a group with one user and shorter output
%[1]s my-group user1 -o name`)
)
type NewGroupOptions struct {
GroupClient client.GroupInterface
Group string
Users []string
Out io.Writer
Printer kubectl.ResourcePrinterFunc
}
func NewCmdNewGroup(name, fullName string, f *clientcmd.Factory, out io.Writer) *cobra.Command {
options := &NewGroupOptions{Out: out}
cmd := &cobra.Command{
Use: name + " GROUP [USER ...]",
Short: "Create a new group",
Long: newLong,
Example: fmt.Sprintf(newExample, fullName),
Run: func(cmd *cobra.Command, args []string) {
if err := options.Complete(f, cmd, args); err != nil {
kcmdutil.CheckErr(kcmdutil.UsageError(cmd, err.Error()))
}
kcmdutil.CheckErr(options.Validate())
kcmdutil.CheckErr(options.AddGroup())
},
}
kcmdutil.AddPrinterFlags(cmd)
return cmd
}
func (o *NewGroupOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return errors.New("You must specify at least one argument: GROUP [USER ...]")
}
o.Group = args[0]
if len(args) > 1 {
o.Users = append(o.Users, args[1:]...)
}
osClient, _, _, err := f.Clients()
if err != nil {
return err
}
o.GroupClient = osClient.Groups()
outputFormat := kcmdutil.GetFlagString(cmd, "output")
templateFile := kcmdutil.GetFlagString(cmd, "template")
noHeaders := kcmdutil.GetFlagBool(cmd, "no-headers")
printer, _, err := kubectl.GetPrinter(outputFormat, templateFile, noHeaders)
if err != nil {
return err
}
if printer != nil {
o.Printer = printer.PrintObj
} else {
o.Printer = func(obj runtime.Object, out io.Writer) error {
mapper, _ := f.Object(false)
return f.PrintObject(cmd, mapper, obj, out)
}
}
return nil
}
func (o *NewGroupOptions) Validate() error {
if len(o.Group) == 0 {
return fmt.Errorf("Group is required")
}
if o.GroupClient == nil {
return fmt.Errorf("GroupClient is required")
}
if o.Out == nil {
return fmt.Errorf("Out is required")
}
if o.Printer == nil {
return fmt.Errorf("Printer is required")
}
return nil
}
func (o *NewGroupOptions) AddGroup() error {
group := &userapi.Group{}
group.Name = o.Group
usedNames := sets.String{}
for _, user := range o.Users {
if usedNames.Has(user) {
continue
}
usedNames.Insert(user)
group.Users = append(group.Users, user)
}
actualGroup, err := o.GroupClient.Create(group)
if err != nil {
return err
}
return o.Printer(actualGroup, o.Out)
}