// NewRollingDeploymentStrategy makes a new RollingDeploymentStrategy. func NewRollingDeploymentStrategy(namespace string, oldClient kclient.Interface, tags client.ImageStreamTagsNamespacer, events record.EventSink, decoder runtime.Decoder, initialStrategy acceptingDeploymentStrategy, out, errOut io.Writer, until string) *RollingDeploymentStrategy { if out == nil { out = ioutil.Discard } if errOut == nil { errOut = ioutil.Discard } // TODO internalclientset: get rid of oldClient after next rebase client := adapter.FromUnversionedClient(oldClient.(*kclient.Client)) return &RollingDeploymentStrategy{ out: out, errOut: errOut, until: until, decoder: decoder, initialStrategy: initialStrategy, rcClient: client.Core(), eventClient: client.Core(), tags: tags, apiRetryPeriod: defaultApiRetryPeriod, apiRetryTimeout: defaultApiRetryTimeout, rollingUpdate: func(config *kubectl.RollingUpdaterConfig) error { updater := kubectl.NewRollingUpdater(namespace, oldClient) return updater.Update(config) }, hookExecutor: stratsupport.NewHookExecutor(client.Core(), tags, client.Core(), os.Stdout, decoder), getUpdateAcceptor: func(timeout time.Duration, minReadySeconds int32) strat.UpdateAcceptor { return stratsupport.NewAcceptAvailablePods(out, client.Core(), timeout, acceptorInterval, minReadySeconds) }, } }
// NewRollingDeploymentStrategy makes a new RollingDeploymentStrategy. func NewRollingDeploymentStrategy(namespace string, client kclient.Interface, tags client.ImageStreamTagsNamespacer, decoder runtime.Decoder, initialStrategy acceptingDeploymentStrategy, out, errOut io.Writer, until string) *RollingDeploymentStrategy { if out == nil { out = ioutil.Discard } if errOut == nil { errOut = ioutil.Discard } return &RollingDeploymentStrategy{ out: out, errOut: errOut, until: until, decoder: decoder, initialStrategy: initialStrategy, client: client, tags: tags, apiRetryPeriod: DefaultApiRetryPeriod, apiRetryTimeout: DefaultApiRetryTimeout, rollingUpdate: func(config *kubectl.RollingUpdaterConfig) error { updater := kubectl.NewRollingUpdater(namespace, client) return updater.Update(config) }, hookExecutor: stratsupport.NewHookExecutor(client, tags, os.Stdout, decoder), getUpdateAcceptor: func(timeout time.Duration) strat.UpdateAcceptor { return stratsupport.NewAcceptNewlyObservedReadyPods(out, client, timeout, AcceptorInterval) }, } }
// NewRecreateDeploymentStrategy makes a RecreateDeploymentStrategy backed by // a real HookExecutor and client. func NewRecreateDeploymentStrategy(client kclient.Interface, tagClient client.ImageStreamTagsNamespacer, events record.EventSink, decoder runtime.Decoder, out, errOut io.Writer, until string) *RecreateDeploymentStrategy { if out == nil { out = ioutil.Discard } if errOut == nil { errOut = ioutil.Discard } scaler, _ := kubectl.ScalerFor(kapi.Kind("ReplicationController"), client) return &RecreateDeploymentStrategy{ out: out, errOut: errOut, events: events, until: until, rcClient: client, eventClient: client, getUpdateAcceptor: func(timeout time.Duration, minReadySeconds int32) strat.UpdateAcceptor { return stratsupport.NewAcceptNewlyObservedReadyPods(out, client, timeout, AcceptorInterval, minReadySeconds) }, scaler: scaler, decoder: decoder, hookExecutor: stratsupport.NewHookExecutor(client, tagClient, client, os.Stdout, decoder), retryTimeout: 120 * time.Second, retryPeriod: 1 * time.Second, } }
// NewRecreateDeploymentStrategy makes a RecreateDeploymentStrategy backed by // a real HookExecutor and client. func NewRecreateDeploymentStrategy(oldClient kclient.Interface, tagClient client.ImageStreamTagsNamespacer, events record.EventSink, decoder runtime.Decoder, out, errOut io.Writer, until string) *RecreateDeploymentStrategy { if out == nil { out = ioutil.Discard } if errOut == nil { errOut = ioutil.Discard } scaler, _ := kubectl.ScalerFor(kapi.Kind("ReplicationController"), oldClient) // TODO internalclientset: get rid of oldClient after next rebase client := adapter.FromUnversionedClient(oldClient.(*kclient.Client)) return &RecreateDeploymentStrategy{ out: out, errOut: errOut, events: events, until: until, rcClient: client.Core(), eventClient: client.Core(), getUpdateAcceptor: func(timeout time.Duration, minReadySeconds int32) strat.UpdateAcceptor { return stratsupport.NewAcceptAvailablePods(out, client.Core(), timeout, acceptorInterval, minReadySeconds) }, scaler: scaler, decoder: decoder, hookExecutor: stratsupport.NewHookExecutor(client.Core(), tagClient, client.Core(), os.Stdout, decoder), retryTimeout: 120 * time.Second, retryPeriod: 1 * time.Second, } }
// NewRecreateDeploymentStrategy makes a RecreateDeploymentStrategy backed by // a real HookExecutor and client. func NewRecreateDeploymentStrategy(client kclient.Interface, codec runtime.Codec) *RecreateDeploymentStrategy { scaler, _ := kubectl.ScalerFor(kapi.Kind("ReplicationController"), client) return &RecreateDeploymentStrategy{ getReplicationController: func(namespace, name string) (*kapi.ReplicationController, error) { return client.ReplicationControllers(namespace).Get(name) }, scaler: scaler, codec: codec, hookExecutor: stratsupport.NewHookExecutor(client, os.Stdout, codec), retryTimeout: 120 * time.Second, retryPeriod: 1 * time.Second, } }
// NewRecreateDeploymentStrategy makes a RecreateDeploymentStrategy backed by // a real HookExecutor and client. func NewRecreateDeploymentStrategy(client kclient.Interface, tagClient client.ImageStreamTagsNamespacer, decoder runtime.Decoder) *RecreateDeploymentStrategy { scaler, _ := kubectl.ScalerFor(kapi.Kind("ReplicationController"), client) return &RecreateDeploymentStrategy{ getReplicationController: func(namespace, name string) (*kapi.ReplicationController, error) { return client.ReplicationControllers(namespace).Get(name) }, getUpdateAcceptor: func(timeout time.Duration) strat.UpdateAcceptor { return stratsupport.NewAcceptNewlyObservedReadyPods(client, timeout, AcceptorInterval) }, scaler: scaler, decoder: decoder, hookExecutor: stratsupport.NewHookExecutor(client, tagClient, os.Stdout, decoder), retryTimeout: 120 * time.Second, retryPeriod: 1 * time.Second, } }
// NewRollingDeploymentStrategy makes a new RollingDeploymentStrategy. func NewRollingDeploymentStrategy(namespace string, client kclient.Interface, codec runtime.Codec, initialStrategy acceptingDeploymentStrategy) *RollingDeploymentStrategy { return &RollingDeploymentStrategy{ codec: codec, initialStrategy: initialStrategy, client: client, apiRetryPeriod: DefaultApiRetryPeriod, apiRetryTimeout: DefaultApiRetryTimeout, rollingUpdate: func(config *kubectl.RollingUpdaterConfig) error { updater := kubectl.NewRollingUpdater(namespace, client) return updater.Update(config) }, hookExecutor: stratsupport.NewHookExecutor(client, os.Stdout), getUpdateAcceptor: func(timeout time.Duration) strat.UpdateAcceptor { return stratsupport.NewAcceptNewlyObservedReadyPods(client, timeout, AcceptorInterval) }, } }
func TestImageStreamTagLifecycleHook(t *testing.T) { testutil.RequireEtcd(t) _, clusterAdminKubeConfig, err := testserver.StartTestMaster() if err != nil { t.Fatalf("unexpected error: %v", err) } clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig) if err != nil { t.Errorf("unexpected error: %v", err) } err = testutil.CreateNamespace(clusterAdminKubeConfig, testutil.Namespace()) if err != nil { t.Errorf("unexpected error: %v", err) } stream := mockImageStream() if _, err := clusterAdminClient.ImageStreams(testutil.Namespace()).Create(stream); err != nil { t.Fatalf("unexpected error: %v", err) } // can tag to a stream that exists exec := stratsupport.NewHookExecutor(nil, clusterAdminClient, os.Stdout, kapi.Codecs.UniversalDecoder()) err = exec.Execute( &deployapi.LifecycleHook{ TagImages: []deployapi.TagImageHook{ { ContainerName: "test", To: kapi.ObjectReference{Kind: "ImageStreamTag", Name: stream.Name + ":test"}, }, }, }, &kapi.ReplicationController{ ObjectMeta: kapi.ObjectMeta{Name: "rc-1", Namespace: testutil.Namespace()}, Spec: kapi.ReplicationControllerSpec{ Template: &kapi.PodTemplateSpec{ Spec: kapi.PodSpec{ Containers: []kapi.Container{ { Name: "test", Image: "someimage:other", }, }, }, }, }, }, "test", "test", ) if err != nil { t.Fatal(err) } if stream, err = clusterAdminClient.ImageStreams(testutil.Namespace()).Get(stream.Name); err != nil { t.Fatalf("unexpected error: %v", err) } if tag, ok := stream.Spec.Tags["test"]; !ok || tag.From == nil || tag.From.Name != "someimage:other" { t.Fatalf("unexpected object: %#v", tag) } // can execute a second time the same tag and it should work exec = stratsupport.NewHookExecutor(nil, clusterAdminClient, os.Stdout, kapi.Codecs.UniversalDecoder()) err = exec.Execute( &deployapi.LifecycleHook{ TagImages: []deployapi.TagImageHook{ { ContainerName: "test", To: kapi.ObjectReference{Kind: "ImageStreamTag", Name: stream.Name + ":test"}, }, }, }, &kapi.ReplicationController{ ObjectMeta: kapi.ObjectMeta{Name: "rc-1", Namespace: testutil.Namespace()}, Spec: kapi.ReplicationControllerSpec{ Template: &kapi.PodTemplateSpec{ Spec: kapi.PodSpec{ Containers: []kapi.Container{ { Name: "test", Image: "someimage:other", }, }, }, }, }, }, "test", "test", ) if err != nil { t.Fatal(err) } // can lifecycle tag a new image stream exec = stratsupport.NewHookExecutor(nil, clusterAdminClient, os.Stdout, kapi.Codecs.UniversalDecoder()) err = exec.Execute( &deployapi.LifecycleHook{ TagImages: []deployapi.TagImageHook{ { ContainerName: "test", To: kapi.ObjectReference{Kind: "ImageStreamTag", Name: "test2:test"}, }, }, }, &kapi.ReplicationController{ ObjectMeta: kapi.ObjectMeta{Name: "rc-1", Namespace: testutil.Namespace()}, Spec: kapi.ReplicationControllerSpec{ Template: &kapi.PodTemplateSpec{ Spec: kapi.PodSpec{ Containers: []kapi.Container{ { Name: "test", Image: "someimage:other", }, }, }, }, }, }, "test", "test", ) if err != nil { t.Fatal(err) } if stream, err = clusterAdminClient.ImageStreams(testutil.Namespace()).Get("test2"); err != nil { t.Fatalf("unexpected error: %v", err) } if tag, ok := stream.Spec.Tags["test"]; !ok || tag.From == nil || tag.From.Name != "someimage:other" { t.Fatalf("unexpected object: %#v", tag) } }