Skip to content

Commit

Permalink
refactor to Complete-Validate-Run
Browse files Browse the repository at this point in the history
  • Loading branch information
Paul Weil committed Jun 8, 2016
1 parent de2a8bc commit f6de223
Showing 1 changed file with 62 additions and 38 deletions.
100 changes: 62 additions & 38 deletions pkg/cmd/admin/registry/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ import (
"github.com/spf13/cobra"
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
extensions "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/restclient"
kclient "k8s.io/kubernetes/pkg/client/unversioned"
kclientcmd "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/runtime"
Expand Down Expand Up @@ -89,6 +90,15 @@ type RegistryConfig struct {
ServingKeyPath string

// TODO: accept environment values.

// below are items that are not specified by the user but are used in completion or
// validation prior to run.
label map[string]string
nodeSelector map[string]string
ports []kapi.ContainerPort
namespace string
kClient *kclient.Client
image string
}

// randomSecretSize is the number of random bytes to generate.
Expand Down Expand Up @@ -131,6 +141,9 @@ func NewCmdRegistry(f *clientcmd.Factory, parentName, name string, out io.Writer
Long: registryLong,
Example: fmt.Sprintf(registryExample, parentName, name),
Run: func(cmd *cobra.Command, args []string) {
kcmdutil.CheckErr(cfg.Complete(f, cmd, out, args))
kcmdutil.CheckErr(cfg.Validate(cmd, args))

err := RunCmdRegistry(f, cmd, out, cfg, args)
if err != cmdutil.ErrExit {
kcmdutil.CheckErr(err)
Expand Down Expand Up @@ -169,22 +182,11 @@ func NewCmdRegistry(f *clientcmd.Factory, parentName, name string, out io.Writer
return cmd
}

// RunCmdRegistry contains all the necessary functionality for the OpenShift cli registry command
func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg *RegistryConfig, args []string) error {
var name string
switch len(args) {
case 0:
name = "docker-registry"
default:
return kcmdutil.UsageError(cmd, "No arguments are allowed to this command")
}
// Complete completes any options that are required by validate or run steps.
func (cfg *RegistryConfig) Complete(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, args []string) error {
cfg.image = cfg.ImageTemplate.ExpandOrDie(cfg.Type)

ports, err := app.ContainerPortsFromString(cfg.Ports)
if err != nil {
return err
}

label := map[string]string{
cfg.label = map[string]string{
"docker-registry": "default",
}
if cfg.Labels != defaultLabel {
Expand All @@ -195,10 +197,10 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg
if len(remove) > 0 {
return kcmdutil.UsageError(cmd, "You may not pass negative labels in %q", cfg.Labels)
}
label = valid
cfg.label = valid
}

nodeSelector := map[string]string{}
cfg.nodeSelector = map[string]string{}
if len(cfg.Selector) > 0 {
valid, remove, err := app.LabelsFromSpec(strings.Split(cfg.Selector, ","))
if err != nil {
Expand All @@ -207,30 +209,52 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg
if len(remove) > 0 {
return kcmdutil.UsageError(cmd, "You may not pass negative labels in selector %q", cfg.Selector)
}
nodeSelector = valid
cfg.nodeSelector = valid
}

image := cfg.ImageTemplate.ExpandOrDie(cfg.Type)
if ports, err := app.ContainerPortsFromString(cfg.Ports); err != nil {
return err
} else {
cfg.ports = ports
}

namespace, _, err := f.OpenShiftClientConfig.Namespace()
if err != nil {
return fmt.Errorf("error getting client: %v", err)
if namespace, _, err := f.OpenShiftClientConfig.Namespace(); err != nil {
return fmt.Errorf("error getting namespace: %v", err)
} else {
cfg.namespace = namespace
}
_, kClient, err := f.Clients()
if err != nil {

if _, kClient, err := f.Clients(); err != nil {
return fmt.Errorf("error getting client: %v", err)
} else {
cfg.kClient = kClient
}

cfg.Action.Bulk.Mapper = clientcmd.ResourceMapper(f)
cfg.Action.Out, cfg.Action.ErrOut = out, cmd.Out()
cfg.Action.Bulk.Op = configcmd.Create

return nil
}

// Validate ensures the options are valid.
func (c *RegistryConfig) Validate(cmd *cobra.Command, args []string) error {
if len(args) > 0 {
return kcmdutil.UsageError(cmd, "No arguments are allowed to this command")
}
return nil
}

// RunCmdRegistry contains all the necessary functionality for the OpenShift cli registry command
func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg *RegistryConfig, args []string) error {
name := "docker-registry"

var clusterIP string

output := cfg.Action.ShouldPrint()
generate := output
if !generate {
service, err := kClient.Services(namespace).Get(name)
service, err := cfg.kClient.Services(cfg.namespace).Get(name)
if err != nil {
if !errors.IsNotFound(err) && !generate {
return fmt.Errorf("can't check for existing docker-registry %q: %v", name, err)
Expand Down Expand Up @@ -312,12 +336,12 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg
}
env["REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_ENFORCEQUOTA"] = enforceQuota
healthzPort := defaultPort
if len(ports) > 0 {
healthzPort = ports[0].ContainerPort
if len(cfg.ports) > 0 {
healthzPort = cfg.ports[0].ContainerPort
env["REGISTRY_HTTP_ADDR"] = fmt.Sprintf(":%d", healthzPort)
env["REGISTRY_HTTP_NET"] = "tcp"
}
secrets, volumes, mounts, extraEnv, tls, err := generateSecretsConfig(cfg, namespace, servingCert, servingKey)
secrets, volumes, mounts, extraEnv, tls, err := generateSecretsConfig(cfg, cfg.namespace, servingCert, servingKey)
if err != nil {
return err
}
Expand All @@ -328,14 +352,14 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg

mountHost := len(cfg.HostMount) > 0
podTemplate := &kapi.PodTemplateSpec{
ObjectMeta: kapi.ObjectMeta{Labels: label},
ObjectMeta: kapi.ObjectMeta{Labels: cfg.label},
Spec: kapi.PodSpec{
NodeSelector: nodeSelector,
NodeSelector: cfg.nodeSelector,
Containers: []kapi.Container{
{
Name: "registry",
Image: image,
Ports: ports,
Image: cfg.image,
Ports: cfg.ports,
Env: env.List(),
VolumeMounts: append(mounts, kapi.VolumeMount{
Name: "registry-storage",
Expand Down Expand Up @@ -374,7 +398,7 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg
{
Kind: "ServiceAccount",
Name: cfg.ServiceAccount,
Namespace: namespace,
Namespace: cfg.namespace,
},
},
RoleRef: kapi.ObjectReference{
Expand All @@ -389,7 +413,7 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg
objects = append(objects, &extensions.DaemonSet{
ObjectMeta: kapi.ObjectMeta{
Name: name,
Labels: label,
Labels: cfg.label,
},
Spec: extensions.DaemonSetSpec{
Template: kapi.PodTemplateSpec{
Expand All @@ -402,11 +426,11 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg
objects = append(objects, &deployapi.DeploymentConfig{
ObjectMeta: kapi.ObjectMeta{
Name: name,
Labels: label,
Labels: cfg.label,
},
Spec: deployapi.DeploymentConfigSpec{
Replicas: cfg.Replicas,
Selector: label,
Selector: cfg.label,
Triggers: []deployapi.DeploymentTriggerPolicy{
{Type: deployapi.DeploymentTriggerOnConfigChange},
},
Expand Down Expand Up @@ -441,7 +465,7 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg
return nil
}

if errs := cfg.Action.WithMessage(fmt.Sprintf("Creating registry %s", cfg.Name), "created").Run(list, namespace); len(errs) > 0 {
if errs := cfg.Action.WithMessage(fmt.Sprintf("Creating registry %s", cfg.Name), "created").Run(list, cfg.namespace); len(errs) > 0 {
return cmdutil.ErrExit
}
return nil
Expand Down

0 comments on commit f6de223

Please sign in to comment.