From 899062e5fd26e1e4438a3ec0618c918b54364dc1 Mon Sep 17 00:00:00 2001 From: Paul Weil Date: Wed, 6 Apr 2016 15:20:48 -0400 Subject: [PATCH] run registry as daemonset --- contrib/completions/bash/oadm | 1 + contrib/completions/bash/oc | 1 + contrib/completions/bash/openshift | 2 ++ pkg/cmd/admin/registry/registry.go | 45 +++++++++++++++++++++--------- pkg/generate/app/pipeline.go | 30 ++++++++++++++------ test/cmd/admin.sh | 10 +++++++ 6 files changed, 68 insertions(+), 21 deletions(-) diff --git a/contrib/completions/bash/oadm b/contrib/completions/bash/oadm index 77eabf4f02eb..f2c1cfd39972 100644 --- a/contrib/completions/bash/oadm +++ b/contrib/completions/bash/oadm @@ -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=") diff --git a/contrib/completions/bash/oc b/contrib/completions/bash/oc index 44fefcb255f1..5adee46758d1 100644 --- a/contrib/completions/bash/oc +++ b/contrib/completions/bash/oc @@ -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=") diff --git a/contrib/completions/bash/openshift b/contrib/completions/bash/openshift index 6452b9133bcc..46d35f1a9bf2 100644 --- a/contrib/completions/bash/openshift +++ b/contrib/completions/bash/openshift @@ -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=") @@ -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=") diff --git a/pkg/cmd/admin/registry/registry.go b/pkg/cmd/admin/registry/registry.go index d00759e559e8..713af49ba0bf 100644 --- a/pkg/cmd/admin/registry/registry.go +++ b/pkg/cmd/admin/registry/registry.go @@ -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" @@ -81,6 +82,7 @@ type RegistryConfig struct { Credentials string Selector string ServiceAccount string + DaemonSet bool ServingCertPath string ServingKeyPath string @@ -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.") // autocompletion hints cmd.MarkFlagFilename("credentials", "kubeconfig") @@ -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 diff --git a/pkg/generate/app/pipeline.go b/pkg/generate/app/pipeline.go index 9176aae6c59a..96c3bc48dda5 100644 --- a/pkg/generate/app/pipeline.go +++ b/pkg/generate/app/pipeline.go @@ -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" @@ -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{} diff --git a/test/cmd/admin.sh b/test/cmd/admin.sh index 878504923090..2e92a876ce03 100755 --- a/test/cmd/admin.sh +++ b/test/cmd/admin.sh @@ -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' +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'