diff --git a/actor/v7action/job.go b/actor/v7action/job.go index d9558f9e18..bc98622510 100644 --- a/actor/v7action/job.go +++ b/actor/v7action/job.go @@ -18,6 +18,7 @@ type PollJobEvent struct { State JobState Err error Warnings Warnings + JobGUID string } func (actor Actor) PollUploadBuildpackJob(jobURL ccv3.JobURL) (Warnings, error) { @@ -39,6 +40,7 @@ func (actor Actor) PollJobToEventStream(jobURL ccv3.JobURL) chan PollJobEvent { State: JobState(event.State), Err: event.Err, Warnings: Warnings(event.Warnings), + JobGUID: event.JobGUID, } } close(output) diff --git a/actor/v7action/job_test.go b/actor/v7action/job_test.go index bfe10768e8..b9239749e0 100644 --- a/actor/v7action/job_test.go +++ b/actor/v7action/job_test.go @@ -81,16 +81,19 @@ var _ = Describe("Job Actions", func() { State: constant.JobProcessing, Err: nil, Warnings: ccv3.Warnings{"foo"}, + JobGUID: "job-guid", } fakeStream <- ccv3.PollJobEvent{ State: constant.JobPolling, Err: nil, Warnings: ccv3.Warnings{"bar"}, + JobGUID: "job-guid", } fakeStream <- ccv3.PollJobEvent{ State: constant.JobFailed, Err: errors.New("bad thing"), Warnings: ccv3.Warnings{"baz"}, + JobGUID: "job-guid", } close(fakeStream) }() @@ -105,16 +108,19 @@ var _ = Describe("Job Actions", func() { State: JobProcessing, Err: nil, Warnings: Warnings{"foo"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(Receive(Equal(PollJobEvent{ State: JobPolling, Err: nil, Warnings: Warnings{"bar"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(Receive(Equal(PollJobEvent{ State: JobFailed, Err: errors.New("bad thing"), Warnings: Warnings{"baz"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(BeClosed()) }) diff --git a/api/cloudcontroller/ccv3/job.go b/api/cloudcontroller/ccv3/job.go index 63189a47f6..69927f7dbd 100644 --- a/api/cloudcontroller/ccv3/job.go +++ b/api/cloudcontroller/ccv3/job.go @@ -150,6 +150,7 @@ type PollJobEvent struct { State constant.JobState Err error Warnings Warnings + JobGUID string } func (client *Client) PollJobToEventStream(jobURL JobURL) chan PollJobEvent { @@ -170,6 +171,7 @@ func (client *Client) PollJobToEventStream(jobURL JobURL) chan PollJobEvent { State: job.State, Err: err, Warnings: warnings, + JobGUID: job.GUID, } switch { diff --git a/api/cloudcontroller/ccv3/job_test.go b/api/cloudcontroller/ccv3/job_test.go index e538a08839..1aca44dc4b 100644 --- a/api/cloudcontroller/ccv3/job_test.go +++ b/api/cloudcontroller/ccv3/job_test.go @@ -431,16 +431,19 @@ var _ = Describe("Job", func() { State: constant.JobProcessing, Err: nil, Warnings: Warnings{"warning-1"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(Receive(Equal(PollJobEvent{ State: constant.JobProcessing, Err: nil, Warnings: Warnings{"warning-2"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(Receive(Equal(PollJobEvent{ State: constant.JobComplete, Err: nil, Warnings: Warnings{"warning-3", "warning-4"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(BeClosed()) }) @@ -458,16 +461,19 @@ var _ = Describe("Job", func() { State: constant.JobProcessing, Err: nil, Warnings: Warnings{"warning-1"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(Receive(Equal(PollJobEvent{ State: constant.JobProcessing, Err: nil, Warnings: Warnings{"warning-2", "warning-3"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(Receive(Equal(PollJobEvent{ State: constant.JobFailed, Err: ccerror.BuildpackAlreadyExistsForStackError{Message: "some-message"}, Warnings: Warnings{"warning-4"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(BeClosed()) }) @@ -500,6 +506,7 @@ var _ = Describe("Job", func() { JobGUID: "job-guid", }, Warnings: Warnings{"warning-4"}, + JobGUID: "job-guid", }))) Eventually(stream).Should(BeClosed()) }) diff --git a/command/v7/bind_route_service_command.go b/command/v7/bind_route_service_command.go index c793182e25..88f86670db 100644 --- a/command/v7/bind_route_service_command.go +++ b/command/v7/bind_route_service_command.go @@ -46,7 +46,7 @@ func (cmd BindRouteServiceCommand) Execute(args []string) error { return err } - completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + completed, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -56,6 +56,7 @@ func (cmd BindRouteServiceCommand) Execute(args []string) error { default: cmd.UI.DisplayOK() cmd.UI.DisplayText("Binding in progress.") + shared.DisplayJobHint(cmd.UI, jobGUID) return nil } } diff --git a/command/v7/bind_route_service_command_test.go b/command/v7/bind_route_service_command_test.go index 9863428b38..6b13a145a5 100644 --- a/command/v7/bind_route_service_command_test.go +++ b/command/v7/bind_route_service_command_test.go @@ -221,6 +221,7 @@ var _ = Describe("bind-route-service Command", func() { eventStream <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"job polling warning"}, + JobGUID: "job-guid", } }() @@ -236,6 +237,7 @@ var _ = Describe("bind-route-service Command", func() { Say(`OK\n`), Say(`\n`), Say(`Binding in progress\.\n`), + Say(`Job \(job-guid\) is being processed\.\n`), )) Expect(testUI.Err).To(SatisfyAll( diff --git a/command/v7/bind_service_command.go b/command/v7/bind_service_command.go index 84db8e2c3d..b8c253981c 100644 --- a/command/v7/bind_service_command.go +++ b/command/v7/bind_service_command.go @@ -57,7 +57,7 @@ func (cmd BindServiceCommand) Execute(args []string) error { return err } - completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + completed, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -68,6 +68,7 @@ func (cmd BindServiceCommand) Execute(args []string) error { default: cmd.UI.DisplayOK() cmd.UI.DisplayText("Binding in progress. Use 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.names()) + shared.DisplayJobHint(cmd.UI, jobGUID) cmd.UI.DisplayNewline() cmd.UI.DisplayText("TIP: Once this operation succeeds, use 'cf restage {{.AppName}}' to ensure your env variable changes take effect", cmd.names()) return nil diff --git a/command/v7/bind_service_command_test.go b/command/v7/bind_service_command_test.go index 22dd0c4705..7f61765ed8 100644 --- a/command/v7/bind_service_command_test.go +++ b/command/v7/bind_service_command_test.go @@ -221,6 +221,7 @@ var _ = Describe("bind-service Command", func() { eventStream <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"job polling warning"}, + JobGUID: "job-guid", } }() @@ -236,6 +237,7 @@ var _ = Describe("bind-service Command", func() { Say(`OK\n`), Say(`\n`), Say(`Binding in progress. Use 'cf service %s' to check operation status.\n`, fakeServiceInstanceName), + Say(`Job \(job-guid\) is being processed\.\n`), Say(`\n`), Say(`TIP: Once this operation succeeds, use 'cf restage %s' to ensure your env variable changes take effect\n`, fakeAppName), )) diff --git a/command/v7/cleanup_outdated_service_bindings_command.go b/command/v7/cleanup_outdated_service_bindings_command.go index d35e07dd2e..1e84b36ac3 100644 --- a/command/v7/cleanup_outdated_service_bindings_command.go +++ b/command/v7/cleanup_outdated_service_bindings_command.go @@ -106,7 +106,7 @@ func (cmd CleanupOutdatedServiceBindingsCommand) Execute(args []string) error { return err } - completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + completed, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -120,6 +120,7 @@ func (cmd CleanupOutdatedServiceBindingsCommand) Execute(args []string) error { } cmd.UI.DisplayOK() cmd.UI.DisplayText("Unbinding in progress. Use 'cf service {{.ServiceInstanceName}}' to check operation status.", map[string]interface{}{"ServiceInstanceName": si.Name}) + shared.DisplayJobHint(cmd.UI, jobGUID) } } diff --git a/command/v7/cleanup_outdated_service_bindings_command_test.go b/command/v7/cleanup_outdated_service_bindings_command_test.go index 7bc1718230..04fe5dc5a3 100644 --- a/command/v7/cleanup_outdated_service_bindings_command_test.go +++ b/command/v7/cleanup_outdated_service_bindings_command_test.go @@ -384,6 +384,7 @@ var _ = Describe("cleanup-outdated-service-bindings Command", func() { eventStream2 <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"job 2 polling warning"}, + JobGUID: "job-guid", } }() @@ -423,6 +424,7 @@ var _ = Describe("cleanup-outdated-service-bindings Command", func() { Say(`OK\n`), Say(`\n`), Say(`Unbinding in progress. Use 'cf service %s' to check operation status\.\n`, fakeServiceInstanceName2), + Say(`Job \(job-guid\) is being processed\.\n`), )) Expect(testUI.Err).To(SatisfyAll( diff --git a/command/v7/create_service_command.go b/command/v7/create_service_command.go index 34fa0829cd..d1e9b6d15a 100644 --- a/command/v7/create_service_command.go +++ b/command/v7/create_service_command.go @@ -95,7 +95,7 @@ func (cmd CreateServiceCommand) Execute(args []string) error { } cmd.UI.DisplayNewline() - complete, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + complete, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -103,6 +103,7 @@ func (cmd CreateServiceCommand) Execute(args []string) error { cmd.UI.DisplayTextWithFlavor("Service instance {{.ServiceInstanceName}} created.", cmd.serviceInstanceName()) default: cmd.UI.DisplayTextWithFlavor("Create in progress. Use 'cf services' or 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.serviceInstanceName()) + shared.DisplayJobHint(cmd.UI, jobGUID) } cmd.UI.DisplayOK() diff --git a/command/v7/create_service_command_test.go b/command/v7/create_service_command_test.go index 0da4aa1e00..3db505ab6b 100644 --- a/command/v7/create_service_command_test.go +++ b/command/v7/create_service_command_test.go @@ -202,6 +202,7 @@ var _ = Describe("create-service Command", func() { fakeStream <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"stream warning"}, + JobGUID: "job-guid", } }() }) @@ -211,6 +212,7 @@ var _ = Describe("create-service Command", func() { Say(`Creating service instance %s in org %s / space %s as %s\.\.\.\n`, requestedServiceInstanceName, fakeOrgName, fakeSpaceName, fakeUserName), Say(`\n`), Say(`Create in progress. Use 'cf services' or 'cf service %s' to check operation status\.\n`, requestedServiceInstanceName), + Say(`Job \(job-guid\) is being processed\.\n`), Say(`OK`), )) diff --git a/command/v7/create_service_key_command.go b/command/v7/create_service_key_command.go index 36f1381fd5..ce3889f1da 100644 --- a/command/v7/create_service_key_command.go +++ b/command/v7/create_service_key_command.go @@ -42,7 +42,7 @@ func (cmd CreateServiceKeyCommand) Execute(args []string) error { return err } - completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + completed, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -52,6 +52,7 @@ func (cmd CreateServiceKeyCommand) Execute(args []string) error { default: cmd.UI.DisplayOK() cmd.UI.DisplayText("Create in progress.") + shared.DisplayJobHint(cmd.UI, jobGUID) return nil } } diff --git a/command/v7/create_service_key_command_test.go b/command/v7/create_service_key_command_test.go index 24d0756950..7741252336 100644 --- a/command/v7/create_service_key_command_test.go +++ b/command/v7/create_service_key_command_test.go @@ -167,6 +167,7 @@ var _ = Describe("create-service-key Command", func() { eventStream <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"job polling warning"}, + JobGUID: "job-guid", } }() @@ -182,6 +183,7 @@ var _ = Describe("create-service-key Command", func() { Say(`OK\n`), Say(`\n`), Say(`Create in progress\.\n`), + Say(`Job \(job-guid\) is being processed\.\n`), )) Expect(testUI.Err).To(SatisfyAll( diff --git a/command/v7/delete_service_command.go b/command/v7/delete_service_command.go index 3a6749a69f..6b4d0fcc18 100644 --- a/command/v7/delete_service_command.go +++ b/command/v7/delete_service_command.go @@ -52,7 +52,7 @@ func (cmd DeleteServiceCommand) Execute(args []string) error { return err } - deleted, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + deleted, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) if err != nil { return err } @@ -62,6 +62,7 @@ func (cmd DeleteServiceCommand) Execute(args []string) error { cmd.UI.DisplayTextWithFlavor("Service instance {{.ServiceInstanceName}} deleted.", cmd.serviceInstanceName()) default: cmd.UI.DisplayText("Delete in progress. Use 'cf services' or 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.serviceInstanceName()) + shared.DisplayJobHint(cmd.UI, jobGUID) } cmd.UI.DisplayOK() diff --git a/command/v7/delete_service_command_test.go b/command/v7/delete_service_command_test.go index efdacea008..9acb4f7c18 100644 --- a/command/v7/delete_service_command_test.go +++ b/command/v7/delete_service_command_test.go @@ -89,7 +89,8 @@ var _ = Describe("delete-service command", func() { go func() { stream <- v7action.PollJobEvent{ - State: v7action.JobPolling, + State: v7action.JobPolling, + JobGUID: "job-guid", } // channel not closed }() @@ -104,6 +105,7 @@ var _ = Describe("delete-service command", func() { Expect(testUI.Out).To(SatisfyAll( Say("\n"), Say(`Delete in progress. Use 'cf services' or 'cf service %s' to check operation status\.\n`, serviceInstanceName), + Say(`Job \(job-guid\) is being processed\.\n`), Say("OK\n"), )) }) diff --git a/command/v7/delete_service_key_command.go b/command/v7/delete_service_key_command.go index ef22c839b3..52e66bd4c6 100644 --- a/command/v7/delete_service_key_command.go +++ b/command/v7/delete_service_key_command.go @@ -53,7 +53,7 @@ func (cmd DeleteServiceKeyCommand) Execute(args []string) error { return err } - completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + completed, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -63,6 +63,7 @@ func (cmd DeleteServiceKeyCommand) Execute(args []string) error { default: cmd.UI.DisplayOK() cmd.UI.DisplayText("Delete in progress.") + shared.DisplayJobHint(cmd.UI, jobGUID) return nil } } diff --git a/command/v7/delete_service_key_command_test.go b/command/v7/delete_service_key_command_test.go index aaddeb96c2..fd7845a043 100644 --- a/command/v7/delete_service_key_command_test.go +++ b/command/v7/delete_service_key_command_test.go @@ -241,6 +241,7 @@ var _ = Describe("delete-service-key Command", func() { eventStream <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"job polling warning"}, + JobGUID: "job-guid", } }() @@ -256,6 +257,7 @@ var _ = Describe("delete-service-key Command", func() { Say(`OK\n`), Say(`\n`), Say(`Delete in progress\.\n`), + Say(`Job \(job-guid\) is being processed\.\n`), )) Expect(testUI.Err).To(SatisfyAll( diff --git a/command/v7/shared/result_waiter.go b/command/v7/shared/result_waiter.go index 5a45465888..0958688967 100644 --- a/command/v7/shared/result_waiter.go +++ b/command/v7/shared/result_waiter.go @@ -8,8 +8,13 @@ import ( ) func WaitForResult(stream chan v7action.PollJobEvent, ui command.UI, waitForCompletion bool) (bool, error) { + completed, _, err := WaitForResultWithJobGUID(stream, ui, waitForCompletion) + return completed, err +} + +func WaitForResultWithJobGUID(stream chan v7action.PollJobEvent, ui command.UI, waitForCompletion bool) (bool, string, error) { if stream == nil { - return true, nil + return true, "", nil } if waitForCompletion { @@ -21,21 +26,32 @@ func WaitForResult(stream chan v7action.PollJobEvent, ui command.UI, waitForComp }() } + var jobGUID string seen := map[string]bool{} for event := range stream { ui.DisplayWarnings(dedupeSeenWarnings(event.Warnings, seen)) + if event.JobGUID != "" { + jobGUID = event.JobGUID + } if waitForCompletion { fmt.Fprint(ui.Writer(), ".") } if event.Err != nil { - return false, event.Err + return false, jobGUID, event.Err } if event.State == v7action.JobPolling && !waitForCompletion { - return false, nil + return false, jobGUID, nil } } - return true, nil + return true, jobGUID, nil +} + +func DisplayJobHint(ui command.UI, jobGUID string) { + if jobGUID == "" { + return + } + ui.DisplayText("Job ({{.JobGUID}}) is being processed.", map[string]interface{}{"JobGUID": jobGUID}) } // dedupeSeenWarnings prints each distinct warning at most once per operation: diff --git a/command/v7/shared/result_waiter_test.go b/command/v7/shared/result_waiter_test.go index 2a1f84703c..34e111e73d 100644 --- a/command/v7/shared/result_waiter_test.go +++ b/command/v7/shared/result_waiter_test.go @@ -134,3 +134,47 @@ var _ = Describe("WaitForResult", func() { }) }) }) + +var _ = Describe("WaitForResultWithJobGUID", func() { + var testUI *ui.UI + + BeforeEach(func() { + testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer()) + }) + + It("returns the job GUID observed on the stream", func() { + s := make(chan v7action.PollJobEvent, 1) + s <- v7action.PollJobEvent{State: v7action.JobPolling, JobGUID: "the-job-guid"} + _, jobGUID, err := WaitForResultWithJobGUID(s, testUI, false) + Expect(err).NotTo(HaveOccurred()) + Expect(jobGUID).To(Equal("the-job-guid")) + }) + + It("returns an empty GUID for a nil stream", func() { + _, jobGUID, err := WaitForResultWithJobGUID(nil, testUI, false) + Expect(err).NotTo(HaveOccurred()) + Expect(jobGUID).To(BeEmpty()) + }) +}) + +var _ = Describe("DisplayJobHint", func() { + var testUI *ui.UI + + BeforeEach(func() { + testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer()) + }) + + When("a job GUID is given", func() { + It("prints a hint naming the job", func() { + DisplayJobHint(testUI, "the-job-guid") + Expect(testUI.Out).To(Say(`Job \(the-job-guid\) is being processed\.`)) + }) + }) + + When("the job GUID is empty", func() { + It("prints nothing", func() { + DisplayJobHint(testUI, "") + Expect(testUI.Out).NotTo(Say("is being processed")) + }) + }) +}) diff --git a/command/v7/unbind_route_service_command.go b/command/v7/unbind_route_service_command.go index d77a474b21..c5b105c1e4 100644 --- a/command/v7/unbind_route_service_command.go +++ b/command/v7/unbind_route_service_command.go @@ -56,7 +56,7 @@ func (cmd UnbindRouteServiceCommand) Execute(args []string) error { return err } - completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + completed, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -66,6 +66,7 @@ func (cmd UnbindRouteServiceCommand) Execute(args []string) error { default: cmd.UI.DisplayOK() cmd.UI.DisplayText("Unbinding in progress.") + shared.DisplayJobHint(cmd.UI, jobGUID) return nil } } diff --git a/command/v7/unbind_route_service_command_test.go b/command/v7/unbind_route_service_command_test.go index 8603e65dcd..7fa142e7ae 100644 --- a/command/v7/unbind_route_service_command_test.go +++ b/command/v7/unbind_route_service_command_test.go @@ -326,6 +326,7 @@ var _ = Describe("unbind-route-service Command", func() { eventStream <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"job polling warning"}, + JobGUID: "job-guid", } }() @@ -341,6 +342,7 @@ var _ = Describe("unbind-route-service Command", func() { Say(`OK\n`), Say(`\n`), Say(`Unbinding in progress\.\n`), + Say(`Job \(job-guid\) is being processed\.\n`), )) Expect(testUI.Err).To(SatisfyAll( diff --git a/command/v7/unbind_service_command.go b/command/v7/unbind_service_command.go index e5a3ab1b87..2e8fb4e170 100644 --- a/command/v7/unbind_service_command.go +++ b/command/v7/unbind_service_command.go @@ -71,7 +71,7 @@ func (cmd UnbindServiceCommand) Execute(args []string) error { return err } - completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + completed, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -80,6 +80,7 @@ func (cmd UnbindServiceCommand) Execute(args []string) error { default: cmd.UI.DisplayOK() cmd.UI.DisplayText("Unbinding in progress. Use 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.names()) + shared.DisplayJobHint(cmd.UI, jobGUID) } } return nil diff --git a/command/v7/unbind_service_command_test.go b/command/v7/unbind_service_command_test.go index 20000beb47..5478d90f4d 100644 --- a/command/v7/unbind_service_command_test.go +++ b/command/v7/unbind_service_command_test.go @@ -209,6 +209,7 @@ var _ = Describe("unbind-service Command", func() { eventStream <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"job polling warning"}, + JobGUID: "job-guid", } }() @@ -225,6 +226,7 @@ var _ = Describe("unbind-service Command", func() { Say(`OK\n`), Say(`\n`), Say(`Unbinding in progress. Use 'cf service %s' to check operation status\.\n`, fakeServiceInstanceName), + Say(`Job \(job-guid\) is being processed\.\n`), )) Expect(testUI.Err).To(SatisfyAll( diff --git a/command/v7/update_service_command.go b/command/v7/update_service_command.go index 2c10086cff..abe9965bb3 100644 --- a/command/v7/update_service_command.go +++ b/command/v7/update_service_command.go @@ -66,7 +66,7 @@ func (cmd UpdateServiceCommand) Execute(args []string) error { return err } - complete, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + complete, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -74,6 +74,7 @@ func (cmd UpdateServiceCommand) Execute(args []string) error { cmd.UI.DisplayTextWithFlavor("Update of service instance {{.ServiceInstance}} complete.", cmd.serviceInstanceName()) default: cmd.UI.DisplayTextWithFlavor("Update in progress. Use 'cf services' or 'cf service {{.ServiceInstance}}' to check operation status.", cmd.serviceInstanceName()) + shared.DisplayJobHint(cmd.UI, jobGUID) } cmd.UI.DisplayOK() diff --git a/command/v7/update_service_command_test.go b/command/v7/update_service_command_test.go index a1b9045d56..6983258334 100644 --- a/command/v7/update_service_command_test.go +++ b/command/v7/update_service_command_test.go @@ -151,6 +151,7 @@ var _ = Describe("update-service command", func() { fakeStream <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"poll warning"}, + JobGUID: "job-guid", } }() }) @@ -160,6 +161,7 @@ var _ = Describe("update-service command", func() { Say(`Updating service instance %s in org %s / space %s as %s...\n`, serviceInstanceName, orgName, spaceName, username), Say(`\n`), Say(`Update in progress. Use 'cf services' or 'cf service %s' to check operation status\.`, serviceInstanceName), + Say(`Job \(job-guid\) is being processed\.\n`), Say(`OK\n`), )) diff --git a/command/v7/upgrade_service_command.go b/command/v7/upgrade_service_command.go index fccd013361..68d1d60f54 100644 --- a/command/v7/upgrade_service_command.go +++ b/command/v7/upgrade_service_command.go @@ -57,7 +57,7 @@ func (cmd UpgradeServiceCommand) Execute(args []string) error { return actorError } - complete, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait) + complete, jobGUID, err := shared.WaitForResultWithJobGUID(stream, cmd.UI, cmd.Wait) switch { case err != nil: return err @@ -65,6 +65,7 @@ func (cmd UpgradeServiceCommand) Execute(args []string) error { cmd.UI.DisplayTextWithFlavor("Upgrade of service instance {{.ServiceInstanceName}} complete.", cmd.serviceInstanceName()) default: cmd.UI.DisplayTextWithFlavor("Upgrade in progress. Use 'cf services' or 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.serviceInstanceName()) + shared.DisplayJobHint(cmd.UI, jobGUID) } cmd.UI.DisplayOK() diff --git a/command/v7/upgrade_service_command_test.go b/command/v7/upgrade_service_command_test.go index cc3fff8c6c..485b3c86a7 100644 --- a/command/v7/upgrade_service_command_test.go +++ b/command/v7/upgrade_service_command_test.go @@ -119,6 +119,7 @@ var _ = Describe("upgrade-service command", func() { fakeStream <- v7action.PollJobEvent{ State: v7action.JobPolling, Warnings: v7action.Warnings{"poll warning"}, + JobGUID: "job-guid", } }() }) @@ -128,6 +129,7 @@ var _ = Describe("upgrade-service command", func() { Say(`Upgrading service instance %s in org %s / space %s as %s...\n`, serviceInstanceName, orgName, spaceName, username), Say(`\n`), Say(`Upgrade in progress. Use 'cf services' or 'cf service %s' to check operation status\.`, serviceInstanceName), + Say(`Job \(job-guid\) is being processed\.\n`), Say(`OK\n`), ))