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
1 change: 1 addition & 0 deletions contrib/completions/bash/oadm
Original file line number Diff line number Diff line change
Expand Up @@ -1491,6 +1491,7 @@ _oadm_registry()
flags+=("--credentials=")
flags_with_completion+=("--credentials")
flags_completion+=("__handle_filename_extension_flag kubeconfig")
flags+=("--daemonset")
flags+=("--dry-run")
flags+=("--images=")
flags+=("--labels=")
Expand Down
1 change: 1 addition & 0 deletions contrib/completions/bash/oc
Original file line number Diff line number Diff line change
Expand Up @@ -4508,6 +4508,7 @@ _oc_adm_registry()
flags+=("--credentials=")
flags_with_completion+=("--credentials")
flags_completion+=("__handle_filename_extension_flag kubeconfig")
flags+=("--daemonset")
flags+=("--dry-run")
flags+=("--images=")
flags+=("--labels=")
Expand Down
2 changes: 2 additions & 0 deletions contrib/completions/bash/openshift
Original file line number Diff line number Diff line change
Expand Up @@ -2066,6 +2066,7 @@ _openshift_admin_registry()
flags+=("--credentials=")
flags_with_completion+=("--credentials")
flags_completion+=("__handle_filename_extension_flag kubeconfig")
flags+=("--daemonset")
flags+=("--dry-run")
flags+=("--images=")
flags+=("--labels=")
Expand Down Expand Up @@ -8093,6 +8094,7 @@ _openshift_cli_adm_registry()
flags+=("--credentials=")
flags_with_completion+=("--credentials")
flags_completion+=("__handle_filename_extension_flag kubeconfig")
flags+=("--daemonset")
flags+=("--dry-run")
flags+=("--images=")
flags+=("--labels=")
Expand Down
45 changes: 32 additions & 13 deletions pkg/cmd/admin/registry/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ 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/client/restclient"
kclientcmd "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
Expand Down Expand Up @@ -81,6 +82,7 @@ type RegistryConfig struct {
Credentials string
Selector string
ServiceAccount string
DaemonSet bool

ServingCertPath string
ServingKeyPath string
Expand Down Expand Up @@ -150,6 +152,7 @@ func NewCmdRegistry(f *clientcmd.Factory, parentName, name string, out io.Writer
cmd.Flags().StringVar(&cfg.Selector, "selector", cfg.Selector, "Selector used to filter nodes on deployment. Used to run registries on a specific set of nodes.")
cmd.Flags().StringVar(&cfg.ServingCertPath, "tls-certificate", cfg.ServingCertPath, "An optional path to a PEM encoded certificate (which may contain the private key) for serving over TLS")
cmd.Flags().StringVar(&cfg.ServingKeyPath, "tls-key", cfg.ServingKeyPath, "An optional path to a PEM encoded private key for serving over TLS")
cmd.Flags().BoolVar(&cfg.DaemonSet, "daemonset", cfg.DaemonSet, "Use a daemonset instead of a deployment config.")
Copy link
Contributor

Choose a reason for hiding this comment

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

This is not specific to this pull, but do we have a plan for rolling out updates to daemonsets like DC's allow?

Copy link
Author

Choose a reason for hiding this comment

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

Orchestration of daemonset updates are in progress upstream at:

kubernetes/kubernetes#18319
kubernetes/kubernetes#19627


// autocompletion hints
cmd.MarkFlagFilename("credentials", "kubeconfig")
Expand Down Expand Up @@ -374,20 +377,36 @@ func RunCmdRegistry(f *clientcmd.Factory, cmd *cobra.Command, out io.Writer, cfg
)
}

objects = append(objects, &deployapi.DeploymentConfig{
ObjectMeta: kapi.ObjectMeta{
Name: name,
Labels: label,
},
Spec: deployapi.DeploymentConfigSpec{
Replicas: cfg.Replicas,
Selector: label,
Triggers: []deployapi.DeploymentTriggerPolicy{
{Type: deployapi.DeploymentTriggerOnConfigChange},
if cfg.DaemonSet {
objects = append(objects, &extensions.DaemonSet{
ObjectMeta: kapi.ObjectMeta{
Name: name,
Labels: label,
},
Template: podTemplate,
},
})
Spec: extensions.DaemonSetSpec{
Template: kapi.PodTemplateSpec{
ObjectMeta: podTemplate.ObjectMeta,
Spec: podTemplate.Spec,
},
},
})
} else {
objects = append(objects, &deployapi.DeploymentConfig{
ObjectMeta: kapi.ObjectMeta{
Name: name,
Labels: label,
},
Spec: deployapi.DeploymentConfigSpec{
Replicas: cfg.Replicas,
Selector: label,
Triggers: []deployapi.DeploymentTriggerPolicy{
{Type: deployapi.DeploymentTriggerOnConfigChange},
},
Template: podTemplate,
},
})
}

objects = app.AddServices(objects, true)

// Set registry service's sessionAffinity to ClientIP to prevent push
Expand Down
30 changes: 22 additions & 8 deletions pkg/generate/app/pipeline.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/validation"
extensions "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/intstr"
kuval "k8s.io/kubernetes/pkg/util/validation"
Expand Down Expand Up @@ -341,21 +342,34 @@ func AddServices(objects Objects, firstPortOnly bool) Objects {
for _, o := range objects {
switch t := o.(type) {
case *deploy.DeploymentConfig:
ports := UniqueContainerToServicePorts(AllContainerPorts(t.Spec.Template.Spec.Containers...))
if len(ports) == 0 {
continue
svc := addServiceInternal(t.Spec.Template.Spec.Containers, t.ObjectMeta, t.Spec.Selector, firstPortOnly)
if svc != nil {
svcs = append(svcs, svc)
}
if firstPortOnly {
ports = ports[:1]
case *extensions.DaemonSet:
svc := addServiceInternal(t.Spec.Template.Spec.Containers, t.ObjectMeta, t.Spec.Template.Labels, firstPortOnly)
if svc != nil {
svcs = append(svcs, svc)
}
svc := GenerateService(t.ObjectMeta, t.Spec.Selector)
svc.Spec.Ports = ports
svcs = append(svcs, svc)
}
}
return append(objects, svcs...)
}

// addServiceInternal utility used by AddServices to create services for multiple types.
func addServiceInternal(containers []kapi.Container, objectMeta kapi.ObjectMeta, selector map[string]string, firstPortOnly bool) *kapi.Service {
ports := UniqueContainerToServicePorts(AllContainerPorts(containers...))
if len(ports) == 0 {
return nil
}
if firstPortOnly {
ports = ports[:1]
}
svc := GenerateService(objectMeta, selector)
svc.Spec.Ports = ports
return svc
}

// AddRoutes sets up routes for the provided objects.
func AddRoutes(objects Objects) Objects {
routes := []runtime.Object{}
Expand Down
10 changes: 10 additions & 0 deletions test/cmd/admin.sh
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,16 @@ echo "router: ok"
os::test::junit::declare_suite_end

os::test::junit::declare_suite_start "cmd/admin/registry"
# Test running a registry as a daemonset
os::cmd::expect_failure_and_text 'oadm registry --daemonset --dry-run' 'does not exist'
Copy link
Contributor

Choose a reason for hiding this comment

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

just read the doc on this. I didn't see that coming.

os::cmd::expect_success_and_text "oadm registry --daemonset -o yaml --credentials=${KUBECONFIG}" 'DaemonSet'
os::cmd::expect_success "oadm registry --daemonset --credentials=${KUBECONFIG} --images='${USE_IMAGES}'"
os::cmd::expect_success_and_text 'oadm registry --daemonset' 'service exists'
os::cmd::expect_success_and_text 'oc get ds/docker-registry --template="{{.status.desiredNumberScheduled}}"' '1'
# clean up so we can test non-daemonset
os::cmd::expect_success "oc delete ds/docker-registry svc/docker-registry"
echo "registry daemonset: ok"

# Test running a registry
os::cmd::expect_failure_and_text 'oadm registry --dry-run' 'does not exist'
os::cmd::expect_success_and_text "oadm registry -o yaml --credentials=${KUBECONFIG}" 'image:.*-docker-registry'
Expand Down