From f59c02ac5275c59c7bd1c23b960e98bff4c2ecfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 2 Aug 2024 16:32:13 -0500 Subject: [PATCH 01/33] Temporarily move integration tests to the push event (#3075) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - We will change this commit in the near future to ensure that the integration tests run again on pull requests Signed-off-by: João Pereira Co-authored-by: Greg Weresch --- .github/workflows/tests-integration.yml | 7 ++++++- .github/workflows/tests-unit.yml | 10 ---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/.github/workflows/tests-integration.yml b/.github/workflows/tests-integration.yml index 8b9df4c28e3..15da28ae607 100644 --- a/.github/workflows/tests-integration.yml +++ b/.github/workflows/tests-integration.yml @@ -24,6 +24,11 @@ on: - "Tests" types: - completed + push: + branches: + - main + - v8 + - v7 jobs: run-integration-tests-cf-env: @@ -74,4 +79,4 @@ jobs: run-with-client-creds: false os: ubuntu-latest name: cats - secrets: inherit \ No newline at end of file + secrets: inherit diff --git a/.github/workflows/tests-unit.yml b/.github/workflows/tests-unit.yml index 0301a89b4ee..51b23b8132c 100644 --- a/.github/workflows/tests-unit.yml +++ b/.github/workflows/tests-unit.yml @@ -84,14 +84,4 @@ jobs: Get-Item Makefile make units - - - integration: - needs: - - units - - units-windows - name: Integration tests - if: ${{ github.event != 'workflow_dispatch' }} - uses: ./.github/workflows/tests-integration.yml - secrets: inherit # vim: set sw=2 ts=2 sts=2 et tw=78 foldlevel=2 fdm=indent nospell: From 7f5d48c53ee84547e6902198808cd29f87a31431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 5 Aug 2024 14:29:51 -0500 Subject: [PATCH 02/33] Choose the correct commit sha when running unit tests (#3076) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: João Pereira --- .../workflows/tests-integration-reusable.yml | 5 +- .github/workflows/tests-integration.yml | 79 +++++++++++++++---- .github/workflows/tests-unit.yml | 1 - 3 files changed, 67 insertions(+), 18 deletions(-) diff --git a/.github/workflows/tests-integration-reusable.yml b/.github/workflows/tests-integration-reusable.yml index dd3a3ea50c0..7e469d4b3a2 100644 --- a/.github/workflows/tests-integration-reusable.yml +++ b/.github/workflows/tests-integration-reusable.yml @@ -28,6 +28,9 @@ on: pool-namespace: type: string default: 'official' + gitRef: + type: string + default: ${{github.event.workflow_run.head_sha}} jobs: run-integration-tests: @@ -40,7 +43,7 @@ jobs: - name: Checkout cli uses: actions/checkout@v4 with: - ref: ${{github.event.workflow_run.head_sha}} + ref: ${{inputs.gitRef}} - name: Checkout cli-ci uses: actions/checkout@v4 diff --git a/.github/workflows/tests-integration.yml b/.github/workflows/tests-integration.yml index 15da28ae607..0e6eb294da5 100644 --- a/.github/workflows/tests-integration.yml +++ b/.github/workflows/tests-integration.yml @@ -1,13 +1,8 @@ name: "Tests: Integration" -run-name: "Integration [${{ github.event.workflow_run.head_branch }}]: ${{ github.event.workflow_run.head_commit.message }}" +run-name: "Integration [${{ github.event_name }}: ${{ github.event.pull_request.head.sha || github.event.push.after || github.event.workflow_run.head_sha}}]: ${{ github.event.workflow_run.head_commit.message }}" on: - workflow_call: - inputs: - workflow: - default: all - type: string workflow_dispatch: inputs: workflow: @@ -15,47 +10,97 @@ on: required: true type: choice options: + - all - run-integration-tests-cf-env - run-integration-tests-cf-env-with-client-creds # - run-integration-tests-cf-env-with-min-capi - run-cats-cf-env - workflow_run: - workflows: - - "Tests" - types: - - completed push: + tags: + - "v9.*" + - "v8.*" + - "v7.*" + pull_request_target: branches: - main + - v9 - v8 - v7 - + paths-ignore: + - "doc/**" + - ".gitpod.yml" + - "README.md" jobs: + get-sha: + runs-on: ubuntu-latest + outputs: + gitRef: ${{steps.calculate.outputs.ref}} + steps: + - id: calculate + run: | + if [[ "${{ github.event_name }}" == "pull_request_target" ]]; then + echo "checkout pull request head ${{ github.event.pull_request.head.sha }}" + echo "ref=${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT + elif [[ "${{ github.event_name }}" == "push" ]]; then + echo "checkout push request ${{github.event.push.after}}" + echo "ref=${{github.event.push.after}}" >> $GITHUB_OUTPUT + else + echo "checkout else ${{ github.event.workflow_run.head_sha }}" + echo "ref=${{github.event.workflow_run.head_sha}}" >> $GITHUB_OUTPUT + fi + units: + name: Basic units to gate for integration tests + runs-on: ubuntu-latest + needs: + - get-sha + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{needs.get-sha.outputs.gitRef}} + - name: Set Up Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + check-latest: true + - name: Run Units + run: make units run-integration-tests-cf-env: name: Integration tests - if: ${{ inputs.workflow == 'all' || inputs.workflow == 'run-integration-tests-cf-env' }} + needs: + - get-sha + - units + if: ${{ github.event_name != 'workflow_dispatch' || inputs.workflow == 'all' || inputs.workflow == 'run-integration-tests-cf-env' }} uses: ./.github/workflows/tests-integration-reusable.yml with: capi-version: edge run-with-client-creds: false os: ubuntu-latest name: Integration + gitRef: ${{needs.get-sha.outputs.gitRef}} secrets: inherit run-integration-tests-cf-env-with-client-creds: name: client creds - if: ${{ inputs.workflow == 'all' || inputs.workflow == 'run-integration-tests-cf-env-with-client-creds' }} + needs: + - get-sha + - units + if: ${{ github.event_name != 'workflow_dispatch' || inputs.workflow == 'all' || inputs.workflow == 'run-integration-tests-cf-env-with-client-creds' }} uses: ./.github/workflows/tests-integration-reusable.yml with: capi-version: edge run-with-client-creds: true os: ubuntu-latest name: Integration client creds + gitRef: ${{needs.get-sha.outputs.gitRef}} secrets: inherit # run-integration-tests-cf-env-with-min-capi: # name: MIN CAPI - # if: ${{ inputs.workflow == 'all' || inputs.workflow == 'run-integration-tests-cf-env-with-min-capi' }} + # needs: + # - get-sha + # - units + # if: ${{ github.event_name != 'workflow_dispatch' || inputs.workflow == 'all' || inputs.workflow == 'run-integration-tests-cf-env-with-min-capi' }} # uses: ./.github/workflows/tests-integration-reusable.yml # with: # capi-version: min @@ -70,13 +115,15 @@ jobs: run-cats-cf-env: name: CATS needs: + - get-sha - run-integration-tests-cf-env - run-integration-tests-cf-env-with-client-creds - if: ${{ inputs.workflow == 'all' || inputs.workflow == 'run-cats-cf-env' }} + if: ${{ github.event_name != 'workflow_dispatch' || inputs.workflow == 'all' || inputs.workflow == 'run-cats-cf-env' }} uses: ./.github/workflows/tests-integration-reusable.yml with: capi-version: edge run-with-client-creds: false os: ubuntu-latest name: cats + gitRef: ${{needs.get-sha.outputs.gitRef}} secrets: inherit diff --git a/.github/workflows/tests-unit.yml b/.github/workflows/tests-unit.yml index 51b23b8132c..94ca66df7fa 100644 --- a/.github/workflows/tests-unit.yml +++ b/.github/workflows/tests-unit.yml @@ -83,5 +83,4 @@ jobs: Get-Command make Get-Item Makefile make units - # vim: set sw=2 ts=2 sts=2 et tw=78 foldlevel=2 fdm=indent nospell: From 081fd8d21cd15a66c5d88327a864aeb75960c592 Mon Sep 17 00:00:00 2001 From: Shwetha Gururaj Date: Wed, 7 Aug 2024 17:11:40 -0400 Subject: [PATCH 03/33] Canary Deployment Changes (#3051) (#3087) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce canary strategy on all the commands Co-authored-by: João Pereira --- actor/v7action/application.go | 17 +- actor/v7action/application_summary_test.go | 27 + actor/v7action/application_test.go | 295 ++-- actor/v7action/cloud_controller_client.go | 4 +- actor/v7action/deployment.go | 16 +- actor/v7action/deployment_test.go | 79 +- .../fake_cloud_controller_client.go | 1447 +++++++++-------- .../create_deployment_for_push_plan.go | 13 +- .../create_deployment_for_push_plan_test.go | 18 +- actor/v7pushaction/sequence.go | 2 +- actor/v7pushaction/sequence_test.go | 12 + actor/v7pushaction/v7_actor.go | 4 +- .../v7pushactionfakes/fake_v7actor.go | 382 +++-- .../ccv3/constant/deployment.go | 52 +- api/cloudcontroller/ccv3/deployment.go | 27 +- api/cloudcontroller/ccv3/deployment_test.go | 63 +- .../ccv3/internal/api_routes.go | 2 + command/common/command_list_v7.go | 1 + command/common/internal/help_all_display.go | 2 +- command/flag/deployment_strategy.go | 7 +- command/flag/deployment_strategy_test.go | 4 +- command/v7/actor.go | 6 +- command/v7/continue_deployment_command.go | 79 + .../v7/continue_deployment_command_test.go | 244 +++ command/v7/copy_source_command.go | 17 +- command/v7/copy_source_command_test.go | 44 +- command/v7/push_command.go | 18 +- command/v7/push_command_test.go | 24 +- command/v7/restage_command.go | 21 +- command/v7/restage_command_test.go | 10 +- command/v7/restart_command.go | 15 +- command/v7/restart_command_test.go | 16 +- command/v7/revisions_command.go | 2 +- command/v7/revisions_command_test.go | 4 +- command/v7/rollback_command.go | 16 +- command/v7/rollback_command_test.go | 8 +- command/v7/shared/app_stager.go | 88 +- command/v7/shared/app_stager_test.go | 75 +- command/v7/shared/app_summary_displayer.go | 13 +- .../v7/shared/app_summary_displayer_test.go | 41 +- .../v7/shared/sharedfakes/fake_app_stager.go | 78 +- command/v7/start_command.go | 19 +- command/v7/start_command_test.go | 24 +- command/v7/v7fakes/fake_actor.go | 333 ++-- integration/v7/isolated/app_command_test.go | 23 + .../v7/isolated/cancel_deployment_test.go | 32 +- .../v7/isolated/continue_deployment_test.go | 101 ++ .../v7/isolated/copy_source_command_test.go | 43 +- .../v7/isolated/restage_command_test.go | 19 +- .../v7/isolated/restart_command_test.go | 26 +- integration/v7/push/canary_push_test.go | 128 ++ resources/deployment_resource.go | 11 +- 52 files changed, 2568 insertions(+), 1484 deletions(-) create mode 100644 command/v7/continue_deployment_command.go create mode 100644 command/v7/continue_deployment_command_test.go create mode 100644 integration/v7/isolated/continue_deployment_test.go create mode 100644 integration/v7/push/canary_push_test.go diff --git a/actor/v7action/application.go b/actor/v7action/application.go index 68470090834..7d1c1fb2dca 100644 --- a/actor/v7action/application.go +++ b/actor/v7action/application.go @@ -298,9 +298,9 @@ func (actor Actor) PollStart(app resources.Application, noWait bool, handleInsta } } -// PollStartForRolling polls a deploying application's processes until some are started. It does the same thing as PollStart, except it accounts for rolling deployments and whether +// PollStartForDeployment polls a deploying application's processes until some are started. It does the same thing as PollStart, except it accounts for rolling/canary deployments and whether // they have failed or been canceled during polling. -func (actor Actor) PollStartForRolling(app resources.Application, deploymentGUID string, noWait bool, handleInstanceDetails func(string)) (Warnings, error) { +func (actor Actor) PollStartForDeployment(app resources.Application, deploymentGUID string, noWait bool, handleInstanceDetails func(string)) (Warnings, error) { var ( deployment resources.Deployment processes []resources.Process @@ -321,7 +321,7 @@ func (actor Actor) PollStartForRolling(app resources.Application, deploymentGUID } return allWarnings, actionerror.StartupTimeoutError{Name: app.Name} case <-timer.C(): - if !isDeployed(deployment) { + if !isDeployProcessed(deployment) { ccDeployment, warnings, err := actor.getDeployment(deploymentGUID) allWarnings = append(allWarnings, warnings...) if err != nil { @@ -335,7 +335,7 @@ func (actor Actor) PollStartForRolling(app resources.Application, deploymentGUID } } - if noWait || isDeployed(deployment) { + if noWait || isDeployProcessed(deployment) { stopPolling, warnings, err := actor.PollProcesses(processes, handleInstanceDetails) allWarnings = append(allWarnings, warnings...) if stopPolling || err != nil { @@ -348,7 +348,12 @@ func (actor Actor) PollStartForRolling(app resources.Application, deploymentGUID } } -func isDeployed(d resources.Deployment) bool { +func isDeployProcessed(d resources.Deployment) bool { + if d.Strategy == constant.DeploymentStrategyCanary { + return d.StatusValue == constant.DeploymentStatusValueActive && d.StatusReason == constant.DeploymentStatusReasonPaused || + d.StatusValue == constant.DeploymentStatusValueFinalized && d.StatusReason == constant.DeploymentStatusReasonDeployed + } + return d.StatusValue == constant.DeploymentStatusValueFinalized && d.StatusReason == constant.DeploymentStatusReasonDeployed } @@ -439,7 +444,7 @@ func (actor Actor) getProcesses(deployment resources.Deployment, appGUID string, // if the deployment is deployed we know web are all running and PollProcesses will see those as stable // so just getting all processes is equivalent to just getting non-web ones and polling those - if isDeployed(deployment) { + if isDeployProcessed(deployment) { processes, warnings, err := actor.CloudControllerClient.GetApplicationProcesses(appGUID) if err != nil { return processes, Warnings(warnings), err diff --git a/actor/v7action/application_summary_test.go b/actor/v7action/application_summary_test.go index cd98c0ad677..7caf75b3da7 100644 --- a/actor/v7action/application_summary_test.go +++ b/actor/v7action/application_summary_test.go @@ -628,6 +628,33 @@ var _ = Describe("Application Summary Actions", func() { }) }) }) + + When("the deployment strategy is canary", func() { + When("the deployment is paused", func() { + BeforeEach(func() { + fakeCloudControllerClient.GetDeploymentsReturns( + []resources.Deployment{ + { + GUID: "some-deployment-guid", + Strategy: "canary", + StatusValue: "ACTIVE", + StatusReason: "PAUSED", + }, + }, + nil, + nil, + ) + }) + It("returns the deployment information", func() { + Expect(summary.Deployment).To(Equal(resources.Deployment{ + GUID: "some-deployment-guid", + Strategy: "canary", + StatusValue: "ACTIVE", + StatusReason: "PAUSED", + })) + }) + }) + }) }) When("the deployment is not active", func() { diff --git a/actor/v7action/application_test.go b/actor/v7action/application_test.go index b88ee4f35c6..06c79bb8f62 100644 --- a/actor/v7action/application_test.go +++ b/actor/v7action/application_test.go @@ -1033,7 +1033,7 @@ var _ = Describe("Application Actions", func() { }) }) - Describe("PollStartForRolling", func() { + Describe("PollStartForDeployment", func() { var ( app resources.Application deploymentGUID string @@ -1065,7 +1065,7 @@ var _ = Describe("Application Actions", func() { JustBeforeEach(func() { go func() { - warnings, executeErr = actor.PollStartForRolling(app, deploymentGUID, noWait, handleInstanceDetails) + warnings, executeErr = actor.PollStartForDeployment(app, deploymentGUID, noWait, handleInstanceDetails) done <- true }() }) @@ -1367,160 +1367,205 @@ var _ = Describe("Application Actions", func() { }) When("things eventually become healthy", func() { - When("the no wait flag is given", func() { - BeforeEach(func() { - // in total three loops 1: deployment still deploying 2: deployment deployed processes starting 3: processes started - noWait = true - - // Always return deploying as a way to check we respect no wait - fakeCloudControllerClient.GetDeploymentReturns( - resources.Deployment{ - StatusValue: constant.DeploymentStatusValueActive, - NewProcesses: []resources.Process{{GUID: "new-deployment-process"}}, - }, - ccv3.Warnings{"get-deployment-warning"}, - nil, - ) + When("it is a rolling deployment", func() { + When("the no wait flag is given", func() { + BeforeEach(func() { + // in total three loops 1: deployment still deploying 2: deployment deployed processes starting 3: processes started + noWait = true - // We only poll the processes. Two loops for fun - fakeCloudControllerClient.GetProcessInstancesReturnsOnCall(0, - []ccv3.ProcessInstance{{State: constant.ProcessInstanceStarting}}, - ccv3.Warnings{"poll-processes-warning-1"}, - nil, - ) + // Always return deploying as a way to check we respect no wait + fakeCloudControllerClient.GetDeploymentReturns( + resources.Deployment{ + Strategy: constant.DeploymentStrategyRolling, + StatusValue: constant.DeploymentStatusValueActive, + NewProcesses: []resources.Process{{GUID: "new-deployment-process"}}, + }, + ccv3.Warnings{"get-deployment-warning"}, + nil, + ) - fakeCloudControllerClient.GetProcessInstancesReturnsOnCall(1, - []ccv3.ProcessInstance{{State: constant.ProcessInstanceRunning}}, - ccv3.Warnings{"poll-processes-warning-2"}, - nil, - ) - }) + // We only poll the processes. Two loops for fun + fakeCloudControllerClient.GetProcessInstancesReturnsOnCall(0, + []ccv3.ProcessInstance{{State: constant.ProcessInstanceStarting}}, + ccv3.Warnings{"poll-processes-warning-1"}, + nil, + ) - It("polls the start of the application correctly and returns warnings and no error", func() { - // Initial tick - fakeClock.WaitForNWatchersAndIncrement(1*time.Millisecond, 2) + fakeCloudControllerClient.GetProcessInstancesReturnsOnCall(1, + []ccv3.ProcessInstance{{State: constant.ProcessInstanceRunning}}, + ccv3.Warnings{"poll-processes-warning-2"}, + nil, + ) + }) - // assert one of our watcher is the timeout - Expect(fakeConfig.StartupTimeoutCallCount()).To(Equal(1)) + It("polls the start of the application correctly and returns warnings and no error", func() { + // Initial tick + fakeClock.WaitForNWatchersAndIncrement(1*time.Millisecond, 2) - // the first time through we always get the deployment regardless of no-wait - Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(1)) - Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(0)).To(Equal(deploymentGUID)) - Eventually(fakeCloudControllerClient.GetProcessInstancesCallCount).Should(Equal(1)) - Expect(fakeCloudControllerClient.GetProcessInstancesArgsForCall(0)).To(Equal("new-deployment-process")) - Eventually(fakeConfig.PollingIntervalCallCount).Should(Equal(1)) + // assert one of our watcher is the timeout + Expect(fakeConfig.StartupTimeoutCallCount()).To(Equal(1)) - fakeClock.Increment(1 * time.Second) + // the first time through we always get the deployment regardless of no-wait + Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(1)) + Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(0)).To(Equal(deploymentGUID)) + Eventually(fakeCloudControllerClient.GetProcessInstancesCallCount).Should(Equal(1)) + Expect(fakeCloudControllerClient.GetProcessInstancesArgsForCall(0)).To(Equal("new-deployment-process")) + Eventually(fakeConfig.PollingIntervalCallCount).Should(Equal(1)) - Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(2)) - Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(0)).To(Equal(deploymentGUID)) - Eventually(fakeCloudControllerClient.GetProcessInstancesCallCount).Should(Equal(2)) - Expect(fakeCloudControllerClient.GetProcessInstancesArgsForCall(0)).To(Equal("new-deployment-process")) + fakeClock.Increment(1 * time.Second) - Eventually(done).Should(Receive(BeTrue())) + Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(2)) + Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(0)).To(Equal(deploymentGUID)) + Eventually(fakeCloudControllerClient.GetProcessInstancesCallCount).Should(Equal(2)) + Expect(fakeCloudControllerClient.GetProcessInstancesArgsForCall(0)).To(Equal("new-deployment-process")) - Expect(executeErr).NotTo(HaveOccurred()) - Expect(warnings).To(ConsistOf( - "get-deployment-warning", - "poll-processes-warning-1", - "get-deployment-warning", - "poll-processes-warning-2", - )) + Eventually(done).Should(Receive(BeTrue())) - Expect(fakeCloudControllerClient.GetDeploymentCallCount()).To(Equal(2)) - Expect(fakeCloudControllerClient.GetApplicationProcessesCallCount()).To(Equal(0)) - Expect(fakeCloudControllerClient.GetProcessInstancesCallCount()).To(Equal(2)) - Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1)) + Expect(executeErr).NotTo(HaveOccurred()) + Expect(warnings).To(ConsistOf( + "get-deployment-warning", + "poll-processes-warning-1", + "get-deployment-warning", + "poll-processes-warning-2", + )) + Expect(fakeCloudControllerClient.GetDeploymentCallCount()).To(Equal(2)) + Expect(fakeCloudControllerClient.GetApplicationProcessesCallCount()).To(Equal(0)) + Expect(fakeCloudControllerClient.GetProcessInstancesCallCount()).To(Equal(2)) + Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1)) + }) }) + When("the no wait flag is not given", func() { + BeforeEach(func() { + // in total three loops 1: deployment still deploying 2: deployment deployed processes starting 3: processes started + fakeCloudControllerClient.GetDeploymentReturnsOnCall(0, + resources.Deployment{StatusValue: constant.DeploymentStatusValueActive}, + ccv3.Warnings{"get-deployment-warning-1"}, + nil, + ) - }) + // Poll the deployment twice to make sure we are polling (one in the above before each) + fakeCloudControllerClient.GetDeploymentReturnsOnCall(1, + resources.Deployment{StatusValue: constant.DeploymentStatusValueFinalized, StatusReason: constant.DeploymentStatusReasonDeployed}, + ccv3.Warnings{"get-deployment-warning-2"}, + nil, + ) - When("the no wait flag is not given", func() { - BeforeEach(func() { - // in total three loops 1: deployment still deploying 2: deployment deployed processes starting 3: processes started - fakeCloudControllerClient.GetDeploymentReturnsOnCall(0, - resources.Deployment{StatusValue: constant.DeploymentStatusValueActive}, - ccv3.Warnings{"get-deployment-warning-1"}, - nil, - ) + // then we get the processes. This should only be called once + fakeCloudControllerClient.GetApplicationProcessesReturns( + []resources.Process{{GUID: "process-guid"}}, + ccv3.Warnings{"get-processes-warning"}, + nil, + ) - // Poll the deployment twice to make sure we are polling (one in the above before each) - fakeCloudControllerClient.GetDeploymentReturnsOnCall(1, - resources.Deployment{StatusValue: constant.DeploymentStatusValueFinalized, StatusReason: constant.DeploymentStatusReasonDeployed}, - ccv3.Warnings{"get-deployment-warning-2"}, - nil, - ) + // then we poll the processes. Two loops for fun + fakeCloudControllerClient.GetProcessInstancesReturnsOnCall(0, + []ccv3.ProcessInstance{{State: constant.ProcessInstanceStarting}}, + ccv3.Warnings{"poll-processes-warning-1"}, + nil, + ) - // then we get the processes. This should only be called once - fakeCloudControllerClient.GetApplicationProcessesReturns( - []resources.Process{{GUID: "process-guid"}}, - ccv3.Warnings{"get-processes-warning"}, - nil, - ) + fakeCloudControllerClient.GetProcessInstancesReturnsOnCall(1, + []ccv3.ProcessInstance{{State: constant.ProcessInstanceRunning}}, + ccv3.Warnings{"poll-processes-warning-2"}, + nil, + ) + }) - // then we poll the processes. Two loops for fun - fakeCloudControllerClient.GetProcessInstancesReturnsOnCall(0, - []ccv3.ProcessInstance{{State: constant.ProcessInstanceStarting}}, - ccv3.Warnings{"poll-processes-warning-1"}, - nil, - ) + It("polls the start of the application correctly and returns warnings and no error", func() { + // Initial tick + fakeClock.WaitForNWatchersAndIncrement(1*time.Millisecond, 2) - fakeCloudControllerClient.GetProcessInstancesReturnsOnCall(1, - []ccv3.ProcessInstance{{State: constant.ProcessInstanceRunning}}, - ccv3.Warnings{"poll-processes-warning-2"}, - nil, - ) - }) + // assert one of our watchers is for the timeout + Expect(fakeConfig.StartupTimeoutCallCount()).To(Equal(1)) - It("polls the start of the application correctly and returns warnings and no error", func() { - // Initial tick - fakeClock.WaitForNWatchersAndIncrement(1*time.Millisecond, 2) + Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(1)) + Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(0)).To(Equal(deploymentGUID)) + Eventually(fakeConfig.PollingIntervalCallCount).Should(Equal(1)) - // assert one of our watchers is for the timeout - Expect(fakeConfig.StartupTimeoutCallCount()).To(Equal(1)) + // start the second loop where the deployment is deployed so we poll processes + fakeClock.Increment(1 * time.Second) - Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(1)) - Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(0)).To(Equal(deploymentGUID)) - Eventually(fakeConfig.PollingIntervalCallCount).Should(Equal(1)) + Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(2)) + Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(1)).To(Equal(deploymentGUID)) + Eventually(fakeCloudControllerClient.GetApplicationProcessesCallCount).Should(Equal(1)) + Expect(fakeCloudControllerClient.GetApplicationProcessesArgsForCall(0)).To(Equal(app.GUID)) + Eventually(fakeCloudControllerClient.GetProcessInstancesCallCount).Should(Equal(1)) + Expect(fakeCloudControllerClient.GetProcessInstancesArgsForCall(0)).To(Equal("process-guid")) + Eventually(fakeConfig.PollingIntervalCallCount).Should(Equal(2)) - // start the second loop where the deployment is deployed so we poll processes - fakeClock.Increment(1 * time.Second) + fakeClock.Increment(1 * time.Second) - Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(2)) - Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(1)).To(Equal(deploymentGUID)) - Eventually(fakeCloudControllerClient.GetApplicationProcessesCallCount).Should(Equal(1)) - Expect(fakeCloudControllerClient.GetApplicationProcessesArgsForCall(0)).To(Equal(app.GUID)) - Eventually(fakeCloudControllerClient.GetProcessInstancesCallCount).Should(Equal(1)) - Expect(fakeCloudControllerClient.GetProcessInstancesArgsForCall(0)).To(Equal("process-guid")) - Eventually(fakeConfig.PollingIntervalCallCount).Should(Equal(2)) + // we should stop polling because it is deployed + Eventually(fakeCloudControllerClient.GetProcessInstancesCallCount).Should(Equal(2)) + Expect(fakeCloudControllerClient.GetProcessInstancesArgsForCall(0)).To(Equal("process-guid")) - fakeClock.Increment(1 * time.Second) + Eventually(done).Should(Receive(BeTrue())) - // we should stop polling because it is deployed - Eventually(fakeCloudControllerClient.GetProcessInstancesCallCount).Should(Equal(2)) - Expect(fakeCloudControllerClient.GetProcessInstancesArgsForCall(0)).To(Equal("process-guid")) + Expect(executeErr).NotTo(HaveOccurred()) + Expect(warnings).To(ConsistOf( + "get-deployment-warning-1", + "get-deployment-warning-2", + "get-processes-warning", + "poll-processes-warning-1", + "poll-processes-warning-2", + )) - Eventually(done).Should(Receive(BeTrue())) + Expect(fakeCloudControllerClient.GetDeploymentCallCount()).To(Equal(2)) + Expect(fakeCloudControllerClient.GetApplicationProcessesCallCount()).To(Equal(1)) + Expect(fakeCloudControllerClient.GetProcessInstancesCallCount()).To(Equal(2)) + Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(2)) + }) + }) + }) - Expect(executeErr).NotTo(HaveOccurred()) - Expect(warnings).To(ConsistOf( - "get-deployment-warning-1", - "get-deployment-warning-2", - "get-processes-warning", - "poll-processes-warning-1", - "poll-processes-warning-2", - )) + When("it is a canary deployment", func() { + When("the no wait flag is not given", func() { + BeforeEach(func() { + fakeCloudControllerClient.GetDeploymentReturnsOnCall(0, + resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonDeploying, + }, + nil, + nil, + ) - Expect(fakeCloudControllerClient.GetDeploymentCallCount()).To(Equal(2)) - Expect(fakeCloudControllerClient.GetApplicationProcessesCallCount()).To(Equal(1)) - Expect(fakeCloudControllerClient.GetProcessInstancesCallCount()).To(Equal(2)) - Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(2)) + fakeCloudControllerClient.GetDeploymentReturnsOnCall(1, + resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonPaused, + }, + nil, + nil, + ) + }) - }) + It("stops polling when the deployment status is paused", func() { + // Initial tick + fakeClock.WaitForNWatchersAndIncrement(1*time.Millisecond, 2) - }) + Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(1)) + Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(0)).To(Equal(deploymentGUID)) + // start the second loop where the deployment is deployed so we poll processes + fakeClock.Increment(1 * time.Second) + + Eventually(fakeCloudControllerClient.GetDeploymentCallCount).Should(Equal(2)) + Expect(fakeCloudControllerClient.GetDeploymentArgsForCall(1)).To(Equal(deploymentGUID)) + + fakeClock.Increment(1 * time.Second) + + // we should stop polling because it is deployed + Eventually(done).Should(Receive(BeTrue())) + Expect(executeErr).NotTo(HaveOccurred()) + Expect(fakeCloudControllerClient.GetDeploymentCallCount()).To(Equal(2)) + Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1)) + }) + }) + }) }) }) diff --git a/actor/v7action/cloud_controller_client.go b/actor/v7action/cloud_controller_client.go index 88849010c58..e8810085e4a 100644 --- a/actor/v7action/cloud_controller_client.go +++ b/actor/v7action/cloud_controller_client.go @@ -18,10 +18,10 @@ type CloudControllerClient interface { ApplySpaceQuota(quotaGUID string, spaceGUID string) (resources.RelationshipList, ccv3.Warnings, error) CheckRoute(domainGUID string, hostname string, path string, port int) (bool, ccv3.Warnings, error) CancelDeployment(deploymentGUID string) (ccv3.Warnings, error) + ContinueDeployment(deploymentGUID string) (ccv3.Warnings, error) CopyPackage(sourcePackageGUID string, targetAppGUID string) (resources.Package, ccv3.Warnings, error) CreateApplication(app resources.Application) (resources.Application, ccv3.Warnings, error) - CreateApplicationDeployment(appGUID string, dropletGUID string) (string, ccv3.Warnings, error) - CreateApplicationDeploymentByRevision(appGUID string, revisionGUID string) (string, ccv3.Warnings, error) + CreateApplicationDeployment(dep resources.Deployment) (string, ccv3.Warnings, error) CreateApplicationProcessScale(appGUID string, process resources.Process) (resources.Process, ccv3.Warnings, error) CreateApplicationTask(appGUID string, task resources.Task) (resources.Task, ccv3.Warnings, error) CreateBuild(build resources.Build) (resources.Build, ccv3.Warnings, error) diff --git a/actor/v7action/deployment.go b/actor/v7action/deployment.go index d707b577e33..e21873d8f40 100644 --- a/actor/v7action/deployment.go +++ b/actor/v7action/deployment.go @@ -7,15 +7,8 @@ import ( "code.cloudfoundry.org/cli/resources" ) -func (actor Actor) CreateDeploymentByApplicationAndDroplet(appGUID string, dropletGUID string) (string, Warnings, error) { - deploymentGUID, warnings, err := actor.CloudControllerClient.CreateApplicationDeployment(appGUID, dropletGUID) - - return deploymentGUID, Warnings(warnings), err -} - -func (actor Actor) CreateDeploymentByApplicationAndRevision(appGUID string, revisionGUID string) (string, Warnings, error) { - deploymentGUID, warnings, err := actor.CloudControllerClient.CreateApplicationDeploymentByRevision(appGUID, revisionGUID) - +func (actor Actor) CreateDeployment(dep resources.Deployment) (string, Warnings, error) { + deploymentGUID, warnings, err := actor.CloudControllerClient.CreateApplicationDeployment(dep) return deploymentGUID, Warnings(warnings), err } @@ -43,3 +36,8 @@ func (actor Actor) CancelDeployment(deploymentGUID string) (Warnings, error) { warnings, err := actor.CloudControllerClient.CancelDeployment(deploymentGUID) return Warnings(warnings), err } + +func (actor Actor) ContinueDeployment(deploymentGUID string) (Warnings, error) { + warnings, err := actor.CloudControllerClient.ContinueDeployment(deploymentGUID) + return Warnings(warnings), err +} diff --git a/actor/v7action/deployment_test.go b/actor/v7action/deployment_test.go index 2326b6c4f3e..33afe3c3312 100644 --- a/actor/v7action/deployment_test.go +++ b/actor/v7action/deployment_test.go @@ -25,21 +25,25 @@ var _ = Describe("Deployment Actions", func() { BeforeEach(func() { actor, fakeCloudControllerClient, _, _, _, _, _ = NewTestActor() - fakeCloudControllerClient.CreateApplicationDeploymentByRevisionReturns( + fakeCloudControllerClient.CreateApplicationDeploymentReturns( "some-deployment-guid", ccv3.Warnings{"create-warning-1", "create-warning-2"}, errors.New("create-error"), ) }) - Describe("CreateDeploymentByApplicationAndRevision", func() { + Describe("Create a deployment with app and revision guids", func() { JustBeforeEach(func() { - returnedDeploymentGUID, warnings, executeErr = actor.CreateDeploymentByApplicationAndRevision("some-app-guid", "some-revision-guid") + var dep resources.Deployment + dep.Strategy = constant.DeploymentStrategyRolling + dep.RevisionGUID = "some-revision-guid" + dep.Relationships = resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: "some-app-guid"}} + returnedDeploymentGUID, warnings, executeErr = actor.CreateDeployment(dep) }) When("the client fails", func() { BeforeEach(func() { - fakeCloudControllerClient.CreateApplicationDeploymentByRevisionReturns( + fakeCloudControllerClient.CreateApplicationDeploymentReturns( "some-deployment-guid", ccv3.Warnings{"create-warning-1", "create-warning-2"}, errors.New("create-deployment-error"), @@ -54,28 +58,32 @@ var _ = Describe("Deployment Actions", func() { It("delegates to the cloud controller client", func() { - Expect(fakeCloudControllerClient.CreateApplicationDeploymentByRevisionCallCount()).To(Equal(1), "CreateApplicationDeploymentByRevision call count") - givenAppGUID, givenRevisionGUID := fakeCloudControllerClient.CreateApplicationDeploymentByRevisionArgsForCall(0) + Expect(fakeCloudControllerClient.CreateApplicationDeploymentCallCount()).To(Equal(1), "CreateApplicationDeploymentByRevision call count") + dep := fakeCloudControllerClient.CreateApplicationDeploymentArgsForCall(0) - Expect(givenAppGUID).To(Equal("some-app-guid")) - Expect(givenRevisionGUID).To(Equal("some-revision-guid")) + Expect(dep.Relationships[constant.RelationshipTypeApplication].GUID).To(Equal("some-app-guid")) + Expect(dep.RevisionGUID).To(Equal("some-revision-guid")) Expect(returnedDeploymentGUID).To(Equal("some-deployment-guid")) Expect(warnings).To(Equal(Warnings{"create-warning-1", "create-warning-2"})) }) }) - Describe("CreateDeploymentByApplicationAndDroplet", func() { + Describe("Create a deployment with app and droplet guids", func() { It("delegates to the cloud controller client", func() { fakeCloudControllerClient.CreateApplicationDeploymentReturns("some-deployment-guid", ccv3.Warnings{"create-warning-1", "create-warning-2"}, errors.New("create-error")) - returnedDeploymentGUID, warnings, executeErr := actor.CreateDeploymentByApplicationAndDroplet("some-app-guid", "some-droplet-guid") + var dep resources.Deployment + dep.Strategy = constant.DeploymentStrategyCanary + dep.Relationships = resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: "some-app-guid"}} + dep.DropletGUID = "some-droplet-guid" + returnedDeploymentGUID, warnings, executeErr := actor.CreateDeployment(dep) Expect(fakeCloudControllerClient.CreateApplicationDeploymentCallCount()).To(Equal(1)) - givenAppGUID, givenDropletGUID := fakeCloudControllerClient.CreateApplicationDeploymentArgsForCall(0) + dep1 := fakeCloudControllerClient.CreateApplicationDeploymentArgsForCall(0) - Expect(givenAppGUID).To(Equal("some-app-guid")) - Expect(givenDropletGUID).To(Equal("some-droplet-guid")) + Expect(dep1.Relationships[constant.RelationshipTypeApplication].GUID).To(Equal("some-app-guid")) + Expect(dep1.DropletGUID).To(Equal("some-droplet-guid")) Expect(returnedDeploymentGUID).To(Equal("some-deployment-guid")) Expect(warnings).To(Equal(Warnings{"create-warning-1", "create-warning-2"})) @@ -206,4 +214,49 @@ var _ = Describe("Deployment Actions", func() { }) }) }) + + Describe("ContinueDeployment", func() { + var ( + deploymentGUID string + + warnings Warnings + executeErr error + ) + + BeforeEach(func() { + deploymentGUID = "dep-guid" + }) + + JustBeforeEach(func() { + warnings, executeErr = actor.ContinueDeployment(deploymentGUID) + }) + + It("delegates to the cc client", func() { + Expect(fakeCloudControllerClient.ContinueDeploymentCallCount()).To(Equal(1)) + Expect(fakeCloudControllerClient.ContinueDeploymentArgsForCall(0)).To(Equal(deploymentGUID)) + }) + + When("the client fails", func() { + BeforeEach(func() { + fakeCloudControllerClient.ContinueDeploymentReturns(ccv3.Warnings{"continue-deployment-warnings"}, errors.New("continue-deployment-error")) + }) + + It("returns the warnings and error", func() { + Expect(executeErr).To(MatchError("continue-deployment-error")) + Expect(warnings).To(ConsistOf("continue-deployment-warnings")) + }) + + }) + + When("the client succeeds", func() { + BeforeEach(func() { + fakeCloudControllerClient.ContinueDeploymentReturns(ccv3.Warnings{"continue-deployment-warnings"}, nil) + }) + + It("returns the warnings and error", func() { + Expect(executeErr).ToNot(HaveOccurred()) + Expect(warnings).To(ConsistOf("continue-deployment-warnings")) + }) + }) + }) }) diff --git a/actor/v7action/v7actionfakes/fake_cloud_controller_client.go b/actor/v7action/v7actionfakes/fake_cloud_controller_client.go index b7ff686364e..942728edbda 100644 --- a/actor/v7action/v7actionfakes/fake_cloud_controller_client.go +++ b/actor/v7action/v7actionfakes/fake_cloud_controller_client.go @@ -77,6 +77,19 @@ type FakeCloudControllerClient struct { result2 ccv3.Warnings result3 error } + ContinueDeploymentStub func(string) (ccv3.Warnings, error) + continueDeploymentMutex sync.RWMutex + continueDeploymentArgsForCall []struct { + arg1 string + } + continueDeploymentReturns struct { + result1 ccv3.Warnings + result2 error + } + continueDeploymentReturnsOnCall map[int]struct { + result1 ccv3.Warnings + result2 error + } CopyPackageStub func(string, string) (resources.Package, ccv3.Warnings, error) copyPackageMutex sync.RWMutex copyPackageArgsForCall []struct { @@ -108,11 +121,10 @@ type FakeCloudControllerClient struct { result2 ccv3.Warnings result3 error } - CreateApplicationDeploymentStub func(string, string) (string, ccv3.Warnings, error) + CreateApplicationDeploymentStub func(resources.Deployment) (string, ccv3.Warnings, error) createApplicationDeploymentMutex sync.RWMutex createApplicationDeploymentArgsForCall []struct { - arg1 string - arg2 string + arg1 resources.Deployment } createApplicationDeploymentReturns struct { result1 string @@ -124,22 +136,6 @@ type FakeCloudControllerClient struct { result2 ccv3.Warnings result3 error } - CreateApplicationDeploymentByRevisionStub func(string, string) (string, ccv3.Warnings, error) - createApplicationDeploymentByRevisionMutex sync.RWMutex - createApplicationDeploymentByRevisionArgsForCall []struct { - arg1 string - arg2 string - } - createApplicationDeploymentByRevisionReturns struct { - result1 string - result2 ccv3.Warnings - result3 error - } - createApplicationDeploymentByRevisionReturnsOnCall map[int]struct { - result1 string - result2 ccv3.Warnings - result3 error - } CreateApplicationProcessScaleStub func(string, resources.Process) (resources.Process, ccv3.Warnings, error) createApplicationProcessScaleMutex sync.RWMutex createApplicationProcessScaleArgsForCall []struct { @@ -2778,15 +2774,16 @@ func (fake *FakeCloudControllerClient) ApplyOrganizationQuota(arg1 string, arg2 arg1 string arg2 string }{arg1, arg2}) + stub := fake.ApplyOrganizationQuotaStub + fakeReturns := fake.applyOrganizationQuotaReturns fake.recordInvocation("ApplyOrganizationQuota", []interface{}{arg1, arg2}) fake.applyOrganizationQuotaMutex.Unlock() - if fake.ApplyOrganizationQuotaStub != nil { - return fake.ApplyOrganizationQuotaStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.applyOrganizationQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -2845,15 +2842,16 @@ func (fake *FakeCloudControllerClient) ApplySpaceQuota(arg1 string, arg2 string) arg1 string arg2 string }{arg1, arg2}) + stub := fake.ApplySpaceQuotaStub + fakeReturns := fake.applySpaceQuotaReturns fake.recordInvocation("ApplySpaceQuota", []interface{}{arg1, arg2}) fake.applySpaceQuotaMutex.Unlock() - if fake.ApplySpaceQuotaStub != nil { - return fake.ApplySpaceQuotaStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.applySpaceQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -2911,15 +2909,16 @@ func (fake *FakeCloudControllerClient) CancelDeployment(arg1 string) (ccv3.Warni fake.cancelDeploymentArgsForCall = append(fake.cancelDeploymentArgsForCall, struct { arg1 string }{arg1}) + stub := fake.CancelDeploymentStub + fakeReturns := fake.cancelDeploymentReturns fake.recordInvocation("CancelDeployment", []interface{}{arg1}) fake.cancelDeploymentMutex.Unlock() - if fake.CancelDeploymentStub != nil { - return fake.CancelDeploymentStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.cancelDeploymentReturns return fakeReturns.result1, fakeReturns.result2 } @@ -2977,15 +2976,16 @@ func (fake *FakeCloudControllerClient) CheckRoute(arg1 string, arg2 string, arg3 arg3 string arg4 int }{arg1, arg2, arg3, arg4}) + stub := fake.CheckRouteStub + fakeReturns := fake.checkRouteReturns fake.recordInvocation("CheckRoute", []interface{}{arg1, arg2, arg3, arg4}) fake.checkRouteMutex.Unlock() - if fake.CheckRouteStub != nil { - return fake.CheckRouteStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.checkRouteReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3037,6 +3037,70 @@ func (fake *FakeCloudControllerClient) CheckRouteReturnsOnCall(i int, result1 bo }{result1, result2, result3} } +func (fake *FakeCloudControllerClient) ContinueDeployment(arg1 string) (ccv3.Warnings, error) { + fake.continueDeploymentMutex.Lock() + ret, specificReturn := fake.continueDeploymentReturnsOnCall[len(fake.continueDeploymentArgsForCall)] + fake.continueDeploymentArgsForCall = append(fake.continueDeploymentArgsForCall, struct { + arg1 string + }{arg1}) + stub := fake.ContinueDeploymentStub + fakeReturns := fake.continueDeploymentReturns + fake.recordInvocation("ContinueDeployment", []interface{}{arg1}) + fake.continueDeploymentMutex.Unlock() + if stub != nil { + return stub(arg1) + } + if specificReturn { + return ret.result1, ret.result2 + } + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeCloudControllerClient) ContinueDeploymentCallCount() int { + fake.continueDeploymentMutex.RLock() + defer fake.continueDeploymentMutex.RUnlock() + return len(fake.continueDeploymentArgsForCall) +} + +func (fake *FakeCloudControllerClient) ContinueDeploymentCalls(stub func(string) (ccv3.Warnings, error)) { + fake.continueDeploymentMutex.Lock() + defer fake.continueDeploymentMutex.Unlock() + fake.ContinueDeploymentStub = stub +} + +func (fake *FakeCloudControllerClient) ContinueDeploymentArgsForCall(i int) string { + fake.continueDeploymentMutex.RLock() + defer fake.continueDeploymentMutex.RUnlock() + argsForCall := fake.continueDeploymentArgsForCall[i] + return argsForCall.arg1 +} + +func (fake *FakeCloudControllerClient) ContinueDeploymentReturns(result1 ccv3.Warnings, result2 error) { + fake.continueDeploymentMutex.Lock() + defer fake.continueDeploymentMutex.Unlock() + fake.ContinueDeploymentStub = nil + fake.continueDeploymentReturns = struct { + result1 ccv3.Warnings + result2 error + }{result1, result2} +} + +func (fake *FakeCloudControllerClient) ContinueDeploymentReturnsOnCall(i int, result1 ccv3.Warnings, result2 error) { + fake.continueDeploymentMutex.Lock() + defer fake.continueDeploymentMutex.Unlock() + fake.ContinueDeploymentStub = nil + if fake.continueDeploymentReturnsOnCall == nil { + fake.continueDeploymentReturnsOnCall = make(map[int]struct { + result1 ccv3.Warnings + result2 error + }) + } + fake.continueDeploymentReturnsOnCall[i] = struct { + result1 ccv3.Warnings + result2 error + }{result1, result2} +} + func (fake *FakeCloudControllerClient) CopyPackage(arg1 string, arg2 string) (resources.Package, ccv3.Warnings, error) { fake.copyPackageMutex.Lock() ret, specificReturn := fake.copyPackageReturnsOnCall[len(fake.copyPackageArgsForCall)] @@ -3044,15 +3108,16 @@ func (fake *FakeCloudControllerClient) CopyPackage(arg1 string, arg2 string) (re arg1 string arg2 string }{arg1, arg2}) + stub := fake.CopyPackageStub + fakeReturns := fake.copyPackageReturns fake.recordInvocation("CopyPackage", []interface{}{arg1, arg2}) fake.copyPackageMutex.Unlock() - if fake.CopyPackageStub != nil { - return fake.CopyPackageStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.copyPackageReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3110,15 +3175,16 @@ func (fake *FakeCloudControllerClient) CreateApplication(arg1 resources.Applicat fake.createApplicationArgsForCall = append(fake.createApplicationArgsForCall, struct { arg1 resources.Application }{arg1}) + stub := fake.CreateApplicationStub + fakeReturns := fake.createApplicationReturns fake.recordInvocation("CreateApplication", []interface{}{arg1}) fake.createApplicationMutex.Unlock() - if fake.CreateApplicationStub != nil { - return fake.CreateApplicationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createApplicationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3170,22 +3236,22 @@ func (fake *FakeCloudControllerClient) CreateApplicationReturnsOnCall(i int, res }{result1, result2, result3} } -func (fake *FakeCloudControllerClient) CreateApplicationDeployment(arg1 string, arg2 string) (string, ccv3.Warnings, error) { +func (fake *FakeCloudControllerClient) CreateApplicationDeployment(arg1 resources.Deployment) (string, ccv3.Warnings, error) { fake.createApplicationDeploymentMutex.Lock() ret, specificReturn := fake.createApplicationDeploymentReturnsOnCall[len(fake.createApplicationDeploymentArgsForCall)] fake.createApplicationDeploymentArgsForCall = append(fake.createApplicationDeploymentArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - fake.recordInvocation("CreateApplicationDeployment", []interface{}{arg1, arg2}) + arg1 resources.Deployment + }{arg1}) + stub := fake.CreateApplicationDeploymentStub + fakeReturns := fake.createApplicationDeploymentReturns + fake.recordInvocation("CreateApplicationDeployment", []interface{}{arg1}) fake.createApplicationDeploymentMutex.Unlock() - if fake.CreateApplicationDeploymentStub != nil { - return fake.CreateApplicationDeploymentStub(arg1, arg2) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createApplicationDeploymentReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3195,17 +3261,17 @@ func (fake *FakeCloudControllerClient) CreateApplicationDeploymentCallCount() in return len(fake.createApplicationDeploymentArgsForCall) } -func (fake *FakeCloudControllerClient) CreateApplicationDeploymentCalls(stub func(string, string) (string, ccv3.Warnings, error)) { +func (fake *FakeCloudControllerClient) CreateApplicationDeploymentCalls(stub func(resources.Deployment) (string, ccv3.Warnings, error)) { fake.createApplicationDeploymentMutex.Lock() defer fake.createApplicationDeploymentMutex.Unlock() fake.CreateApplicationDeploymentStub = stub } -func (fake *FakeCloudControllerClient) CreateApplicationDeploymentArgsForCall(i int) (string, string) { +func (fake *FakeCloudControllerClient) CreateApplicationDeploymentArgsForCall(i int) resources.Deployment { fake.createApplicationDeploymentMutex.RLock() defer fake.createApplicationDeploymentMutex.RUnlock() argsForCall := fake.createApplicationDeploymentArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 + return argsForCall.arg1 } func (fake *FakeCloudControllerClient) CreateApplicationDeploymentReturns(result1 string, result2 ccv3.Warnings, result3 error) { @@ -3237,73 +3303,6 @@ func (fake *FakeCloudControllerClient) CreateApplicationDeploymentReturnsOnCall( }{result1, result2, result3} } -func (fake *FakeCloudControllerClient) CreateApplicationDeploymentByRevision(arg1 string, arg2 string) (string, ccv3.Warnings, error) { - fake.createApplicationDeploymentByRevisionMutex.Lock() - ret, specificReturn := fake.createApplicationDeploymentByRevisionReturnsOnCall[len(fake.createApplicationDeploymentByRevisionArgsForCall)] - fake.createApplicationDeploymentByRevisionArgsForCall = append(fake.createApplicationDeploymentByRevisionArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - fake.recordInvocation("CreateApplicationDeploymentByRevision", []interface{}{arg1, arg2}) - fake.createApplicationDeploymentByRevisionMutex.Unlock() - if fake.CreateApplicationDeploymentByRevisionStub != nil { - return fake.CreateApplicationDeploymentByRevisionStub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - fakeReturns := fake.createApplicationDeploymentByRevisionReturns - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *FakeCloudControllerClient) CreateApplicationDeploymentByRevisionCallCount() int { - fake.createApplicationDeploymentByRevisionMutex.RLock() - defer fake.createApplicationDeploymentByRevisionMutex.RUnlock() - return len(fake.createApplicationDeploymentByRevisionArgsForCall) -} - -func (fake *FakeCloudControllerClient) CreateApplicationDeploymentByRevisionCalls(stub func(string, string) (string, ccv3.Warnings, error)) { - fake.createApplicationDeploymentByRevisionMutex.Lock() - defer fake.createApplicationDeploymentByRevisionMutex.Unlock() - fake.CreateApplicationDeploymentByRevisionStub = stub -} - -func (fake *FakeCloudControllerClient) CreateApplicationDeploymentByRevisionArgsForCall(i int) (string, string) { - fake.createApplicationDeploymentByRevisionMutex.RLock() - defer fake.createApplicationDeploymentByRevisionMutex.RUnlock() - argsForCall := fake.createApplicationDeploymentByRevisionArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *FakeCloudControllerClient) CreateApplicationDeploymentByRevisionReturns(result1 string, result2 ccv3.Warnings, result3 error) { - fake.createApplicationDeploymentByRevisionMutex.Lock() - defer fake.createApplicationDeploymentByRevisionMutex.Unlock() - fake.CreateApplicationDeploymentByRevisionStub = nil - fake.createApplicationDeploymentByRevisionReturns = struct { - result1 string - result2 ccv3.Warnings - result3 error - }{result1, result2, result3} -} - -func (fake *FakeCloudControllerClient) CreateApplicationDeploymentByRevisionReturnsOnCall(i int, result1 string, result2 ccv3.Warnings, result3 error) { - fake.createApplicationDeploymentByRevisionMutex.Lock() - defer fake.createApplicationDeploymentByRevisionMutex.Unlock() - fake.CreateApplicationDeploymentByRevisionStub = nil - if fake.createApplicationDeploymentByRevisionReturnsOnCall == nil { - fake.createApplicationDeploymentByRevisionReturnsOnCall = make(map[int]struct { - result1 string - result2 ccv3.Warnings - result3 error - }) - } - fake.createApplicationDeploymentByRevisionReturnsOnCall[i] = struct { - result1 string - result2 ccv3.Warnings - result3 error - }{result1, result2, result3} -} - func (fake *FakeCloudControllerClient) CreateApplicationProcessScale(arg1 string, arg2 resources.Process) (resources.Process, ccv3.Warnings, error) { fake.createApplicationProcessScaleMutex.Lock() ret, specificReturn := fake.createApplicationProcessScaleReturnsOnCall[len(fake.createApplicationProcessScaleArgsForCall)] @@ -3311,15 +3310,16 @@ func (fake *FakeCloudControllerClient) CreateApplicationProcessScale(arg1 string arg1 string arg2 resources.Process }{arg1, arg2}) + stub := fake.CreateApplicationProcessScaleStub + fakeReturns := fake.createApplicationProcessScaleReturns fake.recordInvocation("CreateApplicationProcessScale", []interface{}{arg1, arg2}) fake.createApplicationProcessScaleMutex.Unlock() - if fake.CreateApplicationProcessScaleStub != nil { - return fake.CreateApplicationProcessScaleStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createApplicationProcessScaleReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3378,15 +3378,16 @@ func (fake *FakeCloudControllerClient) CreateApplicationTask(arg1 string, arg2 r arg1 string arg2 resources.Task }{arg1, arg2}) + stub := fake.CreateApplicationTaskStub + fakeReturns := fake.createApplicationTaskReturns fake.recordInvocation("CreateApplicationTask", []interface{}{arg1, arg2}) fake.createApplicationTaskMutex.Unlock() - if fake.CreateApplicationTaskStub != nil { - return fake.CreateApplicationTaskStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createApplicationTaskReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3444,15 +3445,16 @@ func (fake *FakeCloudControllerClient) CreateBuild(arg1 resources.Build) (resour fake.createBuildArgsForCall = append(fake.createBuildArgsForCall, struct { arg1 resources.Build }{arg1}) + stub := fake.CreateBuildStub + fakeReturns := fake.createBuildReturns fake.recordInvocation("CreateBuild", []interface{}{arg1}) fake.createBuildMutex.Unlock() - if fake.CreateBuildStub != nil { - return fake.CreateBuildStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createBuildReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3510,15 +3512,16 @@ func (fake *FakeCloudControllerClient) CreateBuildpack(arg1 resources.Buildpack) fake.createBuildpackArgsForCall = append(fake.createBuildpackArgsForCall, struct { arg1 resources.Buildpack }{arg1}) + stub := fake.CreateBuildpackStub + fakeReturns := fake.createBuildpackReturns fake.recordInvocation("CreateBuildpack", []interface{}{arg1}) fake.createBuildpackMutex.Unlock() - if fake.CreateBuildpackStub != nil { - return fake.CreateBuildpackStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createBuildpackReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3576,15 +3579,16 @@ func (fake *FakeCloudControllerClient) CreateDomain(arg1 resources.Domain) (reso fake.createDomainArgsForCall = append(fake.createDomainArgsForCall, struct { arg1 resources.Domain }{arg1}) + stub := fake.CreateDomainStub + fakeReturns := fake.createDomainReturns fake.recordInvocation("CreateDomain", []interface{}{arg1}) fake.createDomainMutex.Unlock() - if fake.CreateDomainStub != nil { - return fake.CreateDomainStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createDomainReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3642,15 +3646,16 @@ func (fake *FakeCloudControllerClient) CreateDroplet(arg1 string) (resources.Dro fake.createDropletArgsForCall = append(fake.createDropletArgsForCall, struct { arg1 string }{arg1}) + stub := fake.CreateDropletStub + fakeReturns := fake.createDropletReturns fake.recordInvocation("CreateDroplet", []interface{}{arg1}) fake.createDropletMutex.Unlock() - if fake.CreateDropletStub != nil { - return fake.CreateDropletStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createDropletReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3708,15 +3713,16 @@ func (fake *FakeCloudControllerClient) CreateIsolationSegment(arg1 resources.Iso fake.createIsolationSegmentArgsForCall = append(fake.createIsolationSegmentArgsForCall, struct { arg1 resources.IsolationSegment }{arg1}) + stub := fake.CreateIsolationSegmentStub + fakeReturns := fake.createIsolationSegmentReturns fake.recordInvocation("CreateIsolationSegment", []interface{}{arg1}) fake.createIsolationSegmentMutex.Unlock() - if fake.CreateIsolationSegmentStub != nil { - return fake.CreateIsolationSegmentStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createIsolationSegmentReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3774,15 +3780,16 @@ func (fake *FakeCloudControllerClient) CreateOrganization(arg1 string) (resource fake.createOrganizationArgsForCall = append(fake.createOrganizationArgsForCall, struct { arg1 string }{arg1}) + stub := fake.CreateOrganizationStub + fakeReturns := fake.createOrganizationReturns fake.recordInvocation("CreateOrganization", []interface{}{arg1}) fake.createOrganizationMutex.Unlock() - if fake.CreateOrganizationStub != nil { - return fake.CreateOrganizationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createOrganizationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3840,15 +3847,16 @@ func (fake *FakeCloudControllerClient) CreateOrganizationQuota(arg1 resources.Or fake.createOrganizationQuotaArgsForCall = append(fake.createOrganizationQuotaArgsForCall, struct { arg1 resources.OrganizationQuota }{arg1}) + stub := fake.CreateOrganizationQuotaStub + fakeReturns := fake.createOrganizationQuotaReturns fake.recordInvocation("CreateOrganizationQuota", []interface{}{arg1}) fake.createOrganizationQuotaMutex.Unlock() - if fake.CreateOrganizationQuotaStub != nil { - return fake.CreateOrganizationQuotaStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createOrganizationQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3906,15 +3914,16 @@ func (fake *FakeCloudControllerClient) CreatePackage(arg1 resources.Package) (re fake.createPackageArgsForCall = append(fake.createPackageArgsForCall, struct { arg1 resources.Package }{arg1}) + stub := fake.CreatePackageStub + fakeReturns := fake.createPackageReturns fake.recordInvocation("CreatePackage", []interface{}{arg1}) fake.createPackageMutex.Unlock() - if fake.CreatePackageStub != nil { - return fake.CreatePackageStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createPackageReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -3972,15 +3981,16 @@ func (fake *FakeCloudControllerClient) CreateRole(arg1 resources.Role) (resource fake.createRoleArgsForCall = append(fake.createRoleArgsForCall, struct { arg1 resources.Role }{arg1}) + stub := fake.CreateRoleStub + fakeReturns := fake.createRoleReturns fake.recordInvocation("CreateRole", []interface{}{arg1}) fake.createRoleMutex.Unlock() - if fake.CreateRoleStub != nil { - return fake.CreateRoleStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createRoleReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4038,15 +4048,16 @@ func (fake *FakeCloudControllerClient) CreateRoute(arg1 resources.Route) (resour fake.createRouteArgsForCall = append(fake.createRouteArgsForCall, struct { arg1 resources.Route }{arg1}) + stub := fake.CreateRouteStub + fakeReturns := fake.createRouteReturns fake.recordInvocation("CreateRoute", []interface{}{arg1}) fake.createRouteMutex.Unlock() - if fake.CreateRouteStub != nil { - return fake.CreateRouteStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createRouteReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4104,15 +4115,16 @@ func (fake *FakeCloudControllerClient) CreateRouteBinding(arg1 resources.RouteBi fake.createRouteBindingArgsForCall = append(fake.createRouteBindingArgsForCall, struct { arg1 resources.RouteBinding }{arg1}) + stub := fake.CreateRouteBindingStub + fakeReturns := fake.createRouteBindingReturns fake.recordInvocation("CreateRouteBinding", []interface{}{arg1}) fake.createRouteBindingMutex.Unlock() - if fake.CreateRouteBindingStub != nil { - return fake.CreateRouteBindingStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createRouteBindingReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4170,15 +4182,16 @@ func (fake *FakeCloudControllerClient) CreateSecurityGroup(arg1 resources.Securi fake.createSecurityGroupArgsForCall = append(fake.createSecurityGroupArgsForCall, struct { arg1 resources.SecurityGroup }{arg1}) + stub := fake.CreateSecurityGroupStub + fakeReturns := fake.createSecurityGroupReturns fake.recordInvocation("CreateSecurityGroup", []interface{}{arg1}) fake.createSecurityGroupMutex.Unlock() - if fake.CreateSecurityGroupStub != nil { - return fake.CreateSecurityGroupStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createSecurityGroupReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4236,15 +4249,16 @@ func (fake *FakeCloudControllerClient) CreateServiceBroker(arg1 resources.Servic fake.createServiceBrokerArgsForCall = append(fake.createServiceBrokerArgsForCall, struct { arg1 resources.ServiceBroker }{arg1}) + stub := fake.CreateServiceBrokerStub + fakeReturns := fake.createServiceBrokerReturns fake.recordInvocation("CreateServiceBroker", []interface{}{arg1}) fake.createServiceBrokerMutex.Unlock() - if fake.CreateServiceBrokerStub != nil { - return fake.CreateServiceBrokerStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createServiceBrokerReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4302,15 +4316,16 @@ func (fake *FakeCloudControllerClient) CreateServiceCredentialBinding(arg1 resou fake.createServiceCredentialBindingArgsForCall = append(fake.createServiceCredentialBindingArgsForCall, struct { arg1 resources.ServiceCredentialBinding }{arg1}) + stub := fake.CreateServiceCredentialBindingStub + fakeReturns := fake.createServiceCredentialBindingReturns fake.recordInvocation("CreateServiceCredentialBinding", []interface{}{arg1}) fake.createServiceCredentialBindingMutex.Unlock() - if fake.CreateServiceCredentialBindingStub != nil { - return fake.CreateServiceCredentialBindingStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createServiceCredentialBindingReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4368,15 +4383,16 @@ func (fake *FakeCloudControllerClient) CreateServiceInstance(arg1 resources.Serv fake.createServiceInstanceArgsForCall = append(fake.createServiceInstanceArgsForCall, struct { arg1 resources.ServiceInstance }{arg1}) + stub := fake.CreateServiceInstanceStub + fakeReturns := fake.createServiceInstanceReturns fake.recordInvocation("CreateServiceInstance", []interface{}{arg1}) fake.createServiceInstanceMutex.Unlock() - if fake.CreateServiceInstanceStub != nil { - return fake.CreateServiceInstanceStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createServiceInstanceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4434,15 +4450,16 @@ func (fake *FakeCloudControllerClient) CreateSpace(arg1 resources.Space) (resour fake.createSpaceArgsForCall = append(fake.createSpaceArgsForCall, struct { arg1 resources.Space }{arg1}) + stub := fake.CreateSpaceStub + fakeReturns := fake.createSpaceReturns fake.recordInvocation("CreateSpace", []interface{}{arg1}) fake.createSpaceMutex.Unlock() - if fake.CreateSpaceStub != nil { - return fake.CreateSpaceStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createSpaceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4500,15 +4517,16 @@ func (fake *FakeCloudControllerClient) CreateSpaceQuota(arg1 resources.SpaceQuot fake.createSpaceQuotaArgsForCall = append(fake.createSpaceQuotaArgsForCall, struct { arg1 resources.SpaceQuota }{arg1}) + stub := fake.CreateSpaceQuotaStub + fakeReturns := fake.createSpaceQuotaReturns fake.recordInvocation("CreateSpaceQuota", []interface{}{arg1}) fake.createSpaceQuotaMutex.Unlock() - if fake.CreateSpaceQuotaStub != nil { - return fake.CreateSpaceQuotaStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createSpaceQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4566,15 +4584,16 @@ func (fake *FakeCloudControllerClient) CreateUser(arg1 string) (resources.User, fake.createUserArgsForCall = append(fake.createUserArgsForCall, struct { arg1 string }{arg1}) + stub := fake.CreateUserStub + fakeReturns := fake.createUserReturns fake.recordInvocation("CreateUser", []interface{}{arg1}) fake.createUserMutex.Unlock() - if fake.CreateUserStub != nil { - return fake.CreateUserStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createUserReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4632,15 +4651,16 @@ func (fake *FakeCloudControllerClient) DeleteApplication(arg1 string) (ccv3.JobU fake.deleteApplicationArgsForCall = append(fake.deleteApplicationArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteApplicationStub + fakeReturns := fake.deleteApplicationReturns fake.recordInvocation("DeleteApplication", []interface{}{arg1}) fake.deleteApplicationMutex.Unlock() - if fake.DeleteApplicationStub != nil { - return fake.DeleteApplicationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteApplicationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4700,15 +4720,16 @@ func (fake *FakeCloudControllerClient) DeleteApplicationProcessInstance(arg1 str arg2 string arg3 int }{arg1, arg2, arg3}) + stub := fake.DeleteApplicationProcessInstanceStub + fakeReturns := fake.deleteApplicationProcessInstanceReturns fake.recordInvocation("DeleteApplicationProcessInstance", []interface{}{arg1, arg2, arg3}) fake.deleteApplicationProcessInstanceMutex.Unlock() - if fake.DeleteApplicationProcessInstanceStub != nil { - return fake.DeleteApplicationProcessInstanceStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.deleteApplicationProcessInstanceReturns return fakeReturns.result1, fakeReturns.result2 } @@ -4763,15 +4784,16 @@ func (fake *FakeCloudControllerClient) DeleteBuildpack(arg1 string) (ccv3.JobURL fake.deleteBuildpackArgsForCall = append(fake.deleteBuildpackArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteBuildpackStub + fakeReturns := fake.deleteBuildpackReturns fake.recordInvocation("DeleteBuildpack", []interface{}{arg1}) fake.deleteBuildpackMutex.Unlock() - if fake.DeleteBuildpackStub != nil { - return fake.DeleteBuildpackStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteBuildpackReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4829,15 +4851,16 @@ func (fake *FakeCloudControllerClient) DeleteDomain(arg1 string) (ccv3.JobURL, c fake.deleteDomainArgsForCall = append(fake.deleteDomainArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteDomainStub + fakeReturns := fake.deleteDomainReturns fake.recordInvocation("DeleteDomain", []interface{}{arg1}) fake.deleteDomainMutex.Unlock() - if fake.DeleteDomainStub != nil { - return fake.DeleteDomainStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteDomainReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -4895,15 +4918,16 @@ func (fake *FakeCloudControllerClient) DeleteIsolationSegment(arg1 string) (ccv3 fake.deleteIsolationSegmentArgsForCall = append(fake.deleteIsolationSegmentArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteIsolationSegmentStub + fakeReturns := fake.deleteIsolationSegmentReturns fake.recordInvocation("DeleteIsolationSegment", []interface{}{arg1}) fake.deleteIsolationSegmentMutex.Unlock() - if fake.DeleteIsolationSegmentStub != nil { - return fake.DeleteIsolationSegmentStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.deleteIsolationSegmentReturns return fakeReturns.result1, fakeReturns.result2 } @@ -4959,15 +4983,16 @@ func (fake *FakeCloudControllerClient) DeleteIsolationSegmentOrganization(arg1 s arg1 string arg2 string }{arg1, arg2}) + stub := fake.DeleteIsolationSegmentOrganizationStub + fakeReturns := fake.deleteIsolationSegmentOrganizationReturns fake.recordInvocation("DeleteIsolationSegmentOrganization", []interface{}{arg1, arg2}) fake.deleteIsolationSegmentOrganizationMutex.Unlock() - if fake.DeleteIsolationSegmentOrganizationStub != nil { - return fake.DeleteIsolationSegmentOrganizationStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.deleteIsolationSegmentOrganizationReturns return fakeReturns.result1, fakeReturns.result2 } @@ -5022,15 +5047,16 @@ func (fake *FakeCloudControllerClient) DeleteOrganization(arg1 string) (ccv3.Job fake.deleteOrganizationArgsForCall = append(fake.deleteOrganizationArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteOrganizationStub + fakeReturns := fake.deleteOrganizationReturns fake.recordInvocation("DeleteOrganization", []interface{}{arg1}) fake.deleteOrganizationMutex.Unlock() - if fake.DeleteOrganizationStub != nil { - return fake.DeleteOrganizationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteOrganizationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5088,15 +5114,16 @@ func (fake *FakeCloudControllerClient) DeleteOrganizationQuota(arg1 string) (ccv fake.deleteOrganizationQuotaArgsForCall = append(fake.deleteOrganizationQuotaArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteOrganizationQuotaStub + fakeReturns := fake.deleteOrganizationQuotaReturns fake.recordInvocation("DeleteOrganizationQuota", []interface{}{arg1}) fake.deleteOrganizationQuotaMutex.Unlock() - if fake.DeleteOrganizationQuotaStub != nil { - return fake.DeleteOrganizationQuotaStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteOrganizationQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5154,15 +5181,16 @@ func (fake *FakeCloudControllerClient) DeleteOrphanedRoutes(arg1 string) (ccv3.J fake.deleteOrphanedRoutesArgsForCall = append(fake.deleteOrphanedRoutesArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteOrphanedRoutesStub + fakeReturns := fake.deleteOrphanedRoutesReturns fake.recordInvocation("DeleteOrphanedRoutes", []interface{}{arg1}) fake.deleteOrphanedRoutesMutex.Unlock() - if fake.DeleteOrphanedRoutesStub != nil { - return fake.DeleteOrphanedRoutesStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteOrphanedRoutesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5220,15 +5248,16 @@ func (fake *FakeCloudControllerClient) DeleteRole(arg1 string) (ccv3.JobURL, ccv fake.deleteRoleArgsForCall = append(fake.deleteRoleArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteRoleStub + fakeReturns := fake.deleteRoleReturns fake.recordInvocation("DeleteRole", []interface{}{arg1}) fake.deleteRoleMutex.Unlock() - if fake.DeleteRoleStub != nil { - return fake.DeleteRoleStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteRoleReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5286,15 +5315,16 @@ func (fake *FakeCloudControllerClient) DeleteRoute(arg1 string) (ccv3.JobURL, cc fake.deleteRouteArgsForCall = append(fake.deleteRouteArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteRouteStub + fakeReturns := fake.deleteRouteReturns fake.recordInvocation("DeleteRoute", []interface{}{arg1}) fake.deleteRouteMutex.Unlock() - if fake.DeleteRouteStub != nil { - return fake.DeleteRouteStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteRouteReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5352,15 +5382,16 @@ func (fake *FakeCloudControllerClient) DeleteRouteBinding(arg1 string) (ccv3.Job fake.deleteRouteBindingArgsForCall = append(fake.deleteRouteBindingArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteRouteBindingStub + fakeReturns := fake.deleteRouteBindingReturns fake.recordInvocation("DeleteRouteBinding", []interface{}{arg1}) fake.deleteRouteBindingMutex.Unlock() - if fake.DeleteRouteBindingStub != nil { - return fake.DeleteRouteBindingStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteRouteBindingReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5418,15 +5449,16 @@ func (fake *FakeCloudControllerClient) DeleteSecurityGroup(arg1 string) (ccv3.Jo fake.deleteSecurityGroupArgsForCall = append(fake.deleteSecurityGroupArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteSecurityGroupStub + fakeReturns := fake.deleteSecurityGroupReturns fake.recordInvocation("DeleteSecurityGroup", []interface{}{arg1}) fake.deleteSecurityGroupMutex.Unlock() - if fake.DeleteSecurityGroupStub != nil { - return fake.DeleteSecurityGroupStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteSecurityGroupReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5484,15 +5516,16 @@ func (fake *FakeCloudControllerClient) DeleteServiceBroker(arg1 string) (ccv3.Jo fake.deleteServiceBrokerArgsForCall = append(fake.deleteServiceBrokerArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteServiceBrokerStub + fakeReturns := fake.deleteServiceBrokerReturns fake.recordInvocation("DeleteServiceBroker", []interface{}{arg1}) fake.deleteServiceBrokerMutex.Unlock() - if fake.DeleteServiceBrokerStub != nil { - return fake.DeleteServiceBrokerStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteServiceBrokerReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5550,15 +5583,16 @@ func (fake *FakeCloudControllerClient) DeleteServiceCredentialBinding(arg1 strin fake.deleteServiceCredentialBindingArgsForCall = append(fake.deleteServiceCredentialBindingArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteServiceCredentialBindingStub + fakeReturns := fake.deleteServiceCredentialBindingReturns fake.recordInvocation("DeleteServiceCredentialBinding", []interface{}{arg1}) fake.deleteServiceCredentialBindingMutex.Unlock() - if fake.DeleteServiceCredentialBindingStub != nil { - return fake.DeleteServiceCredentialBindingStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteServiceCredentialBindingReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5617,15 +5651,16 @@ func (fake *FakeCloudControllerClient) DeleteServiceInstance(arg1 string, arg2 . arg1 string arg2 []ccv3.Query }{arg1, arg2}) + stub := fake.DeleteServiceInstanceStub + fakeReturns := fake.deleteServiceInstanceReturns fake.recordInvocation("DeleteServiceInstance", []interface{}{arg1, arg2}) fake.deleteServiceInstanceMutex.Unlock() - if fake.DeleteServiceInstanceStub != nil { - return fake.DeleteServiceInstanceStub(arg1, arg2...) + if stub != nil { + return stub(arg1, arg2...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteServiceInstanceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5684,15 +5719,16 @@ func (fake *FakeCloudControllerClient) DeleteServicePlanVisibility(arg1 string, arg1 string arg2 string }{arg1, arg2}) + stub := fake.DeleteServicePlanVisibilityStub + fakeReturns := fake.deleteServicePlanVisibilityReturns fake.recordInvocation("DeleteServicePlanVisibility", []interface{}{arg1, arg2}) fake.deleteServicePlanVisibilityMutex.Unlock() - if fake.DeleteServicePlanVisibilityStub != nil { - return fake.DeleteServicePlanVisibilityStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.deleteServicePlanVisibilityReturns return fakeReturns.result1, fakeReturns.result2 } @@ -5747,15 +5783,16 @@ func (fake *FakeCloudControllerClient) DeleteSpace(arg1 string) (ccv3.JobURL, cc fake.deleteSpaceArgsForCall = append(fake.deleteSpaceArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteSpaceStub + fakeReturns := fake.deleteSpaceReturns fake.recordInvocation("DeleteSpace", []interface{}{arg1}) fake.deleteSpaceMutex.Unlock() - if fake.DeleteSpaceStub != nil { - return fake.DeleteSpaceStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteSpaceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5813,15 +5850,16 @@ func (fake *FakeCloudControllerClient) DeleteSpaceQuota(arg1 string) (ccv3.JobUR fake.deleteSpaceQuotaArgsForCall = append(fake.deleteSpaceQuotaArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteSpaceQuotaStub + fakeReturns := fake.deleteSpaceQuotaReturns fake.recordInvocation("DeleteSpaceQuota", []interface{}{arg1}) fake.deleteSpaceQuotaMutex.Unlock() - if fake.DeleteSpaceQuotaStub != nil { - return fake.DeleteSpaceQuotaStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteSpaceQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5879,15 +5917,16 @@ func (fake *FakeCloudControllerClient) DeleteUser(arg1 string) (ccv3.JobURL, ccv fake.deleteUserArgsForCall = append(fake.deleteUserArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DeleteUserStub + fakeReturns := fake.deleteUserReturns fake.recordInvocation("DeleteUser", []interface{}{arg1}) fake.deleteUserMutex.Unlock() - if fake.DeleteUserStub != nil { - return fake.DeleteUserStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.deleteUserReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -5945,15 +5984,16 @@ func (fake *FakeCloudControllerClient) DownloadDroplet(arg1 string) ([]byte, ccv fake.downloadDropletArgsForCall = append(fake.downloadDropletArgsForCall, struct { arg1 string }{arg1}) + stub := fake.DownloadDropletStub + fakeReturns := fake.downloadDropletReturns fake.recordInvocation("DownloadDroplet", []interface{}{arg1}) fake.downloadDropletMutex.Unlock() - if fake.DownloadDropletStub != nil { - return fake.DownloadDropletStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.downloadDropletReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6017,15 +6057,16 @@ func (fake *FakeCloudControllerClient) EntitleIsolationSegmentToOrganizations(ar arg1 string arg2 []string }{arg1, arg2Copy}) + stub := fake.EntitleIsolationSegmentToOrganizationsStub + fakeReturns := fake.entitleIsolationSegmentToOrganizationsReturns fake.recordInvocation("EntitleIsolationSegmentToOrganizations", []interface{}{arg1, arg2Copy}) fake.entitleIsolationSegmentToOrganizationsMutex.Unlock() - if fake.EntitleIsolationSegmentToOrganizationsStub != nil { - return fake.EntitleIsolationSegmentToOrganizationsStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.entitleIsolationSegmentToOrganizationsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6084,15 +6125,16 @@ func (fake *FakeCloudControllerClient) GetAppFeature(arg1 string, arg2 string) ( arg1 string arg2 string }{arg1, arg2}) + stub := fake.GetAppFeatureStub + fakeReturns := fake.getAppFeatureReturns fake.recordInvocation("GetAppFeature", []interface{}{arg1, arg2}) fake.getAppFeatureMutex.Unlock() - if fake.GetAppFeatureStub != nil { - return fake.GetAppFeatureStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getAppFeatureReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6151,15 +6193,16 @@ func (fake *FakeCloudControllerClient) GetApplicationByNameAndSpace(arg1 string, arg1 string arg2 string }{arg1, arg2}) + stub := fake.GetApplicationByNameAndSpaceStub + fakeReturns := fake.getApplicationByNameAndSpaceReturns fake.recordInvocation("GetApplicationByNameAndSpace", []interface{}{arg1, arg2}) fake.getApplicationByNameAndSpaceMutex.Unlock() - if fake.GetApplicationByNameAndSpaceStub != nil { - return fake.GetApplicationByNameAndSpaceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationByNameAndSpaceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6217,15 +6260,16 @@ func (fake *FakeCloudControllerClient) GetApplicationDropletCurrent(arg1 string) fake.getApplicationDropletCurrentArgsForCall = append(fake.getApplicationDropletCurrentArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetApplicationDropletCurrentStub + fakeReturns := fake.getApplicationDropletCurrentReturns fake.recordInvocation("GetApplicationDropletCurrent", []interface{}{arg1}) fake.getApplicationDropletCurrentMutex.Unlock() - if fake.GetApplicationDropletCurrentStub != nil { - return fake.GetApplicationDropletCurrentStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationDropletCurrentReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6283,15 +6327,16 @@ func (fake *FakeCloudControllerClient) GetApplicationEnvironment(arg1 string) (c fake.getApplicationEnvironmentArgsForCall = append(fake.getApplicationEnvironmentArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetApplicationEnvironmentStub + fakeReturns := fake.getApplicationEnvironmentReturns fake.recordInvocation("GetApplicationEnvironment", []interface{}{arg1}) fake.getApplicationEnvironmentMutex.Unlock() - if fake.GetApplicationEnvironmentStub != nil { - return fake.GetApplicationEnvironmentStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationEnvironmentReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6349,15 +6394,16 @@ func (fake *FakeCloudControllerClient) GetApplicationManifest(arg1 string) ([]by fake.getApplicationManifestArgsForCall = append(fake.getApplicationManifestArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetApplicationManifestStub + fakeReturns := fake.getApplicationManifestReturns fake.recordInvocation("GetApplicationManifest", []interface{}{arg1}) fake.getApplicationManifestMutex.Unlock() - if fake.GetApplicationManifestStub != nil { - return fake.GetApplicationManifestStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationManifestReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6416,15 +6462,16 @@ func (fake *FakeCloudControllerClient) GetApplicationProcessByType(arg1 string, arg1 string arg2 string }{arg1, arg2}) + stub := fake.GetApplicationProcessByTypeStub + fakeReturns := fake.getApplicationProcessByTypeReturns fake.recordInvocation("GetApplicationProcessByType", []interface{}{arg1, arg2}) fake.getApplicationProcessByTypeMutex.Unlock() - if fake.GetApplicationProcessByTypeStub != nil { - return fake.GetApplicationProcessByTypeStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationProcessByTypeReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6482,15 +6529,16 @@ func (fake *FakeCloudControllerClient) GetApplicationProcesses(arg1 string) ([]r fake.getApplicationProcessesArgsForCall = append(fake.getApplicationProcessesArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetApplicationProcessesStub + fakeReturns := fake.getApplicationProcessesReturns fake.recordInvocation("GetApplicationProcesses", []interface{}{arg1}) fake.getApplicationProcessesMutex.Unlock() - if fake.GetApplicationProcessesStub != nil { - return fake.GetApplicationProcessesStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationProcessesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6549,15 +6597,16 @@ func (fake *FakeCloudControllerClient) GetApplicationRevisions(arg1 string, arg2 arg1 string arg2 []ccv3.Query }{arg1, arg2}) + stub := fake.GetApplicationRevisionsStub + fakeReturns := fake.getApplicationRevisionsReturns fake.recordInvocation("GetApplicationRevisions", []interface{}{arg1, arg2}) fake.getApplicationRevisionsMutex.Unlock() - if fake.GetApplicationRevisionsStub != nil { - return fake.GetApplicationRevisionsStub(arg1, arg2...) + if stub != nil { + return stub(arg1, arg2...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationRevisionsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6615,15 +6664,16 @@ func (fake *FakeCloudControllerClient) GetApplicationRevisionsDeployed(arg1 stri fake.getApplicationRevisionsDeployedArgsForCall = append(fake.getApplicationRevisionsDeployedArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetApplicationRevisionsDeployedStub + fakeReturns := fake.getApplicationRevisionsDeployedReturns fake.recordInvocation("GetApplicationRevisionsDeployed", []interface{}{arg1}) fake.getApplicationRevisionsDeployedMutex.Unlock() - if fake.GetApplicationRevisionsDeployedStub != nil { - return fake.GetApplicationRevisionsDeployedStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationRevisionsDeployedReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6681,15 +6731,16 @@ func (fake *FakeCloudControllerClient) GetApplicationRoutes(arg1 string) ([]reso fake.getApplicationRoutesArgsForCall = append(fake.getApplicationRoutesArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetApplicationRoutesStub + fakeReturns := fake.getApplicationRoutesReturns fake.recordInvocation("GetApplicationRoutes", []interface{}{arg1}) fake.getApplicationRoutesMutex.Unlock() - if fake.GetApplicationRoutesStub != nil { - return fake.GetApplicationRoutesStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationRoutesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6748,15 +6799,16 @@ func (fake *FakeCloudControllerClient) GetApplicationTasks(arg1 string, arg2 ... arg1 string arg2 []ccv3.Query }{arg1, arg2}) + stub := fake.GetApplicationTasksStub + fakeReturns := fake.getApplicationTasksReturns fake.recordInvocation("GetApplicationTasks", []interface{}{arg1, arg2}) fake.getApplicationTasksMutex.Unlock() - if fake.GetApplicationTasksStub != nil { - return fake.GetApplicationTasksStub(arg1, arg2...) + if stub != nil { + return stub(arg1, arg2...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationTasksReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6814,15 +6866,16 @@ func (fake *FakeCloudControllerClient) GetApplications(arg1 ...ccv3.Query) ([]re fake.getApplicationsArgsForCall = append(fake.getApplicationsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetApplicationsStub + fakeReturns := fake.getApplicationsReturns fake.recordInvocation("GetApplications", []interface{}{arg1}) fake.getApplicationsMutex.Unlock() - if fake.GetApplicationsStub != nil { - return fake.GetApplicationsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6880,15 +6933,16 @@ func (fake *FakeCloudControllerClient) GetBuild(arg1 string) (resources.Build, c fake.getBuildArgsForCall = append(fake.getBuildArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetBuildStub + fakeReturns := fake.getBuildReturns fake.recordInvocation("GetBuild", []interface{}{arg1}) fake.getBuildMutex.Unlock() - if fake.GetBuildStub != nil { - return fake.GetBuildStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getBuildReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -6946,15 +7000,16 @@ func (fake *FakeCloudControllerClient) GetBuildpacks(arg1 ...ccv3.Query) ([]reso fake.getBuildpacksArgsForCall = append(fake.getBuildpacksArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetBuildpacksStub + fakeReturns := fake.getBuildpacksReturns fake.recordInvocation("GetBuildpacks", []interface{}{arg1}) fake.getBuildpacksMutex.Unlock() - if fake.GetBuildpacksStub != nil { - return fake.GetBuildpacksStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getBuildpacksReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7012,15 +7067,16 @@ func (fake *FakeCloudControllerClient) GetDefaultDomain(arg1 string) (resources. fake.getDefaultDomainArgsForCall = append(fake.getDefaultDomainArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetDefaultDomainStub + fakeReturns := fake.getDefaultDomainReturns fake.recordInvocation("GetDefaultDomain", []interface{}{arg1}) fake.getDefaultDomainMutex.Unlock() - if fake.GetDefaultDomainStub != nil { - return fake.GetDefaultDomainStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getDefaultDomainReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7078,15 +7134,16 @@ func (fake *FakeCloudControllerClient) GetDeployment(arg1 string) (resources.Dep fake.getDeploymentArgsForCall = append(fake.getDeploymentArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetDeploymentStub + fakeReturns := fake.getDeploymentReturns fake.recordInvocation("GetDeployment", []interface{}{arg1}) fake.getDeploymentMutex.Unlock() - if fake.GetDeploymentStub != nil { - return fake.GetDeploymentStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getDeploymentReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7144,15 +7201,16 @@ func (fake *FakeCloudControllerClient) GetDeployments(arg1 ...ccv3.Query) ([]res fake.getDeploymentsArgsForCall = append(fake.getDeploymentsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetDeploymentsStub + fakeReturns := fake.getDeploymentsReturns fake.recordInvocation("GetDeployments", []interface{}{arg1}) fake.getDeploymentsMutex.Unlock() - if fake.GetDeploymentsStub != nil { - return fake.GetDeploymentsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getDeploymentsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7210,15 +7268,16 @@ func (fake *FakeCloudControllerClient) GetDomain(arg1 string) (resources.Domain, fake.getDomainArgsForCall = append(fake.getDomainArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetDomainStub + fakeReturns := fake.getDomainReturns fake.recordInvocation("GetDomain", []interface{}{arg1}) fake.getDomainMutex.Unlock() - if fake.GetDomainStub != nil { - return fake.GetDomainStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getDomainReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7276,15 +7335,16 @@ func (fake *FakeCloudControllerClient) GetDomains(arg1 ...ccv3.Query) ([]resourc fake.getDomainsArgsForCall = append(fake.getDomainsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetDomainsStub + fakeReturns := fake.getDomainsReturns fake.recordInvocation("GetDomains", []interface{}{arg1}) fake.getDomainsMutex.Unlock() - if fake.GetDomainsStub != nil { - return fake.GetDomainsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getDomainsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7342,15 +7402,16 @@ func (fake *FakeCloudControllerClient) GetDroplet(arg1 string) (resources.Drople fake.getDropletArgsForCall = append(fake.getDropletArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetDropletStub + fakeReturns := fake.getDropletReturns fake.recordInvocation("GetDroplet", []interface{}{arg1}) fake.getDropletMutex.Unlock() - if fake.GetDropletStub != nil { - return fake.GetDropletStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getDropletReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7408,15 +7469,16 @@ func (fake *FakeCloudControllerClient) GetDroplets(arg1 ...ccv3.Query) ([]resour fake.getDropletsArgsForCall = append(fake.getDropletsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetDropletsStub + fakeReturns := fake.getDropletsReturns fake.recordInvocation("GetDroplets", []interface{}{arg1}) fake.getDropletsMutex.Unlock() - if fake.GetDropletsStub != nil { - return fake.GetDropletsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getDropletsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7474,15 +7536,16 @@ func (fake *FakeCloudControllerClient) GetEnvironmentVariableGroup(arg1 constant fake.getEnvironmentVariableGroupArgsForCall = append(fake.getEnvironmentVariableGroupArgsForCall, struct { arg1 constant.EnvironmentVariableGroupName }{arg1}) + stub := fake.GetEnvironmentVariableGroupStub + fakeReturns := fake.getEnvironmentVariableGroupReturns fake.recordInvocation("GetEnvironmentVariableGroup", []interface{}{arg1}) fake.getEnvironmentVariableGroupMutex.Unlock() - if fake.GetEnvironmentVariableGroupStub != nil { - return fake.GetEnvironmentVariableGroupStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getEnvironmentVariableGroupReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7540,15 +7603,16 @@ func (fake *FakeCloudControllerClient) GetEvents(arg1 ...ccv3.Query) ([]ccv3.Eve fake.getEventsArgsForCall = append(fake.getEventsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetEventsStub + fakeReturns := fake.getEventsReturns fake.recordInvocation("GetEvents", []interface{}{arg1}) fake.getEventsMutex.Unlock() - if fake.GetEventsStub != nil { - return fake.GetEventsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getEventsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7606,15 +7670,16 @@ func (fake *FakeCloudControllerClient) GetFeatureFlag(arg1 string) (resources.Fe fake.getFeatureFlagArgsForCall = append(fake.getFeatureFlagArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetFeatureFlagStub + fakeReturns := fake.getFeatureFlagReturns fake.recordInvocation("GetFeatureFlag", []interface{}{arg1}) fake.getFeatureFlagMutex.Unlock() - if fake.GetFeatureFlagStub != nil { - return fake.GetFeatureFlagStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getFeatureFlagReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7671,15 +7736,16 @@ func (fake *FakeCloudControllerClient) GetFeatureFlags() ([]resources.FeatureFla ret, specificReturn := fake.getFeatureFlagsReturnsOnCall[len(fake.getFeatureFlagsArgsForCall)] fake.getFeatureFlagsArgsForCall = append(fake.getFeatureFlagsArgsForCall, struct { }{}) + stub := fake.GetFeatureFlagsStub + fakeReturns := fake.getFeatureFlagsReturns fake.recordInvocation("GetFeatureFlags", []interface{}{}) fake.getFeatureFlagsMutex.Unlock() - if fake.GetFeatureFlagsStub != nil { - return fake.GetFeatureFlagsStub() + if stub != nil { + return stub() } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getFeatureFlagsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7729,15 +7795,16 @@ func (fake *FakeCloudControllerClient) GetInfo() (ccv3.Info, ccv3.Warnings, erro ret, specificReturn := fake.getInfoReturnsOnCall[len(fake.getInfoArgsForCall)] fake.getInfoArgsForCall = append(fake.getInfoArgsForCall, struct { }{}) + stub := fake.GetInfoStub + fakeReturns := fake.getInfoReturns fake.recordInvocation("GetInfo", []interface{}{}) fake.getInfoMutex.Unlock() - if fake.GetInfoStub != nil { - return fake.GetInfoStub() + if stub != nil { + return stub() } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getInfoReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7788,15 +7855,16 @@ func (fake *FakeCloudControllerClient) GetIsolationSegment(arg1 string) (resourc fake.getIsolationSegmentArgsForCall = append(fake.getIsolationSegmentArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetIsolationSegmentStub + fakeReturns := fake.getIsolationSegmentReturns fake.recordInvocation("GetIsolationSegment", []interface{}{arg1}) fake.getIsolationSegmentMutex.Unlock() - if fake.GetIsolationSegmentStub != nil { - return fake.GetIsolationSegmentStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getIsolationSegmentReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7854,15 +7922,16 @@ func (fake *FakeCloudControllerClient) GetIsolationSegmentOrganizations(arg1 str fake.getIsolationSegmentOrganizationsArgsForCall = append(fake.getIsolationSegmentOrganizationsArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetIsolationSegmentOrganizationsStub + fakeReturns := fake.getIsolationSegmentOrganizationsReturns fake.recordInvocation("GetIsolationSegmentOrganizations", []interface{}{arg1}) fake.getIsolationSegmentOrganizationsMutex.Unlock() - if fake.GetIsolationSegmentOrganizationsStub != nil { - return fake.GetIsolationSegmentOrganizationsStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getIsolationSegmentOrganizationsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7920,15 +7989,16 @@ func (fake *FakeCloudControllerClient) GetIsolationSegments(arg1 ...ccv3.Query) fake.getIsolationSegmentsArgsForCall = append(fake.getIsolationSegmentsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetIsolationSegmentsStub + fakeReturns := fake.getIsolationSegmentsReturns fake.recordInvocation("GetIsolationSegments", []interface{}{arg1}) fake.getIsolationSegmentsMutex.Unlock() - if fake.GetIsolationSegmentsStub != nil { - return fake.GetIsolationSegmentsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getIsolationSegmentsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -7987,15 +8057,16 @@ func (fake *FakeCloudControllerClient) GetNewApplicationProcesses(arg1 string, a arg1 string arg2 string }{arg1, arg2}) + stub := fake.GetNewApplicationProcessesStub + fakeReturns := fake.getNewApplicationProcessesReturns fake.recordInvocation("GetNewApplicationProcesses", []interface{}{arg1, arg2}) fake.getNewApplicationProcessesMutex.Unlock() - if fake.GetNewApplicationProcessesStub != nil { - return fake.GetNewApplicationProcessesStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getNewApplicationProcessesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8053,15 +8124,16 @@ func (fake *FakeCloudControllerClient) GetOrganization(arg1 string) (resources.O fake.getOrganizationArgsForCall = append(fake.getOrganizationArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetOrganizationStub + fakeReturns := fake.getOrganizationReturns fake.recordInvocation("GetOrganization", []interface{}{arg1}) fake.getOrganizationMutex.Unlock() - if fake.GetOrganizationStub != nil { - return fake.GetOrganizationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getOrganizationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8119,15 +8191,16 @@ func (fake *FakeCloudControllerClient) GetOrganizationDefaultIsolationSegment(ar fake.getOrganizationDefaultIsolationSegmentArgsForCall = append(fake.getOrganizationDefaultIsolationSegmentArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetOrganizationDefaultIsolationSegmentStub + fakeReturns := fake.getOrganizationDefaultIsolationSegmentReturns fake.recordInvocation("GetOrganizationDefaultIsolationSegment", []interface{}{arg1}) fake.getOrganizationDefaultIsolationSegmentMutex.Unlock() - if fake.GetOrganizationDefaultIsolationSegmentStub != nil { - return fake.GetOrganizationDefaultIsolationSegmentStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getOrganizationDefaultIsolationSegmentReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8186,15 +8259,16 @@ func (fake *FakeCloudControllerClient) GetOrganizationDomains(arg1 string, arg2 arg1 string arg2 []ccv3.Query }{arg1, arg2}) + stub := fake.GetOrganizationDomainsStub + fakeReturns := fake.getOrganizationDomainsReturns fake.recordInvocation("GetOrganizationDomains", []interface{}{arg1, arg2}) fake.getOrganizationDomainsMutex.Unlock() - if fake.GetOrganizationDomainsStub != nil { - return fake.GetOrganizationDomainsStub(arg1, arg2...) + if stub != nil { + return stub(arg1, arg2...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getOrganizationDomainsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8252,15 +8326,16 @@ func (fake *FakeCloudControllerClient) GetOrganizationQuota(arg1 string) (resour fake.getOrganizationQuotaArgsForCall = append(fake.getOrganizationQuotaArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetOrganizationQuotaStub + fakeReturns := fake.getOrganizationQuotaReturns fake.recordInvocation("GetOrganizationQuota", []interface{}{arg1}) fake.getOrganizationQuotaMutex.Unlock() - if fake.GetOrganizationQuotaStub != nil { - return fake.GetOrganizationQuotaStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getOrganizationQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8318,15 +8393,16 @@ func (fake *FakeCloudControllerClient) GetOrganizationQuotas(arg1 ...ccv3.Query) fake.getOrganizationQuotasArgsForCall = append(fake.getOrganizationQuotasArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetOrganizationQuotasStub + fakeReturns := fake.getOrganizationQuotasReturns fake.recordInvocation("GetOrganizationQuotas", []interface{}{arg1}) fake.getOrganizationQuotasMutex.Unlock() - if fake.GetOrganizationQuotasStub != nil { - return fake.GetOrganizationQuotasStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getOrganizationQuotasReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8384,15 +8460,16 @@ func (fake *FakeCloudControllerClient) GetOrganizations(arg1 ...ccv3.Query) ([]r fake.getOrganizationsArgsForCall = append(fake.getOrganizationsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetOrganizationsStub + fakeReturns := fake.getOrganizationsReturns fake.recordInvocation("GetOrganizations", []interface{}{arg1}) fake.getOrganizationsMutex.Unlock() - if fake.GetOrganizationsStub != nil { - return fake.GetOrganizationsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getOrganizationsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8450,15 +8527,16 @@ func (fake *FakeCloudControllerClient) GetPackage(arg1 string) (resources.Packag fake.getPackageArgsForCall = append(fake.getPackageArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetPackageStub + fakeReturns := fake.getPackageReturns fake.recordInvocation("GetPackage", []interface{}{arg1}) fake.getPackageMutex.Unlock() - if fake.GetPackageStub != nil { - return fake.GetPackageStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getPackageReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8517,15 +8595,16 @@ func (fake *FakeCloudControllerClient) GetPackageDroplets(arg1 string, arg2 ...c arg1 string arg2 []ccv3.Query }{arg1, arg2}) + stub := fake.GetPackageDropletsStub + fakeReturns := fake.getPackageDropletsReturns fake.recordInvocation("GetPackageDroplets", []interface{}{arg1, arg2}) fake.getPackageDropletsMutex.Unlock() - if fake.GetPackageDropletsStub != nil { - return fake.GetPackageDropletsStub(arg1, arg2...) + if stub != nil { + return stub(arg1, arg2...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getPackageDropletsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8583,15 +8662,16 @@ func (fake *FakeCloudControllerClient) GetPackages(arg1 ...ccv3.Query) ([]resour fake.getPackagesArgsForCall = append(fake.getPackagesArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetPackagesStub + fakeReturns := fake.getPackagesReturns fake.recordInvocation("GetPackages", []interface{}{arg1}) fake.getPackagesMutex.Unlock() - if fake.GetPackagesStub != nil { - return fake.GetPackagesStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getPackagesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8649,15 +8729,16 @@ func (fake *FakeCloudControllerClient) GetProcess(arg1 string) (resources.Proces fake.getProcessArgsForCall = append(fake.getProcessArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetProcessStub + fakeReturns := fake.getProcessReturns fake.recordInvocation("GetProcess", []interface{}{arg1}) fake.getProcessMutex.Unlock() - if fake.GetProcessStub != nil { - return fake.GetProcessStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getProcessReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8715,15 +8796,16 @@ func (fake *FakeCloudControllerClient) GetProcessInstances(arg1 string) ([]ccv3. fake.getProcessInstancesArgsForCall = append(fake.getProcessInstancesArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetProcessInstancesStub + fakeReturns := fake.getProcessInstancesReturns fake.recordInvocation("GetProcessInstances", []interface{}{arg1}) fake.getProcessInstancesMutex.Unlock() - if fake.GetProcessInstancesStub != nil { - return fake.GetProcessInstancesStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getProcessInstancesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8781,15 +8863,16 @@ func (fake *FakeCloudControllerClient) GetProcessSidecars(arg1 string) ([]resour fake.getProcessSidecarsArgsForCall = append(fake.getProcessSidecarsArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetProcessSidecarsStub + fakeReturns := fake.getProcessSidecarsReturns fake.recordInvocation("GetProcessSidecars", []interface{}{arg1}) fake.getProcessSidecarsMutex.Unlock() - if fake.GetProcessSidecarsStub != nil { - return fake.GetProcessSidecarsStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getProcessSidecarsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8847,15 +8930,16 @@ func (fake *FakeCloudControllerClient) GetProcesses(arg1 ...ccv3.Query) ([]resou fake.getProcessesArgsForCall = append(fake.getProcessesArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetProcessesStub + fakeReturns := fake.getProcessesReturns fake.recordInvocation("GetProcesses", []interface{}{arg1}) fake.getProcessesMutex.Unlock() - if fake.GetProcessesStub != nil { - return fake.GetProcessesStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getProcessesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -8913,15 +8997,16 @@ func (fake *FakeCloudControllerClient) GetRoles(arg1 ...ccv3.Query) ([]resources fake.getRolesArgsForCall = append(fake.getRolesArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetRolesStub + fakeReturns := fake.getRolesReturns fake.recordInvocation("GetRoles", []interface{}{arg1}) fake.getRolesMutex.Unlock() - if fake.GetRolesStub != nil { - return fake.GetRolesStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3, ret.result4 } - fakeReturns := fake.getRolesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3, fakeReturns.result4 } @@ -8982,15 +9067,16 @@ func (fake *FakeCloudControllerClient) GetRouteBindings(arg1 ...ccv3.Query) ([]r fake.getRouteBindingsArgsForCall = append(fake.getRouteBindingsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetRouteBindingsStub + fakeReturns := fake.getRouteBindingsReturns fake.recordInvocation("GetRouteBindings", []interface{}{arg1}) fake.getRouteBindingsMutex.Unlock() - if fake.GetRouteBindingsStub != nil { - return fake.GetRouteBindingsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3, ret.result4 } - fakeReturns := fake.getRouteBindingsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3, fakeReturns.result4 } @@ -9051,15 +9137,16 @@ func (fake *FakeCloudControllerClient) GetRouteDestinations(arg1 string) ([]reso fake.getRouteDestinationsArgsForCall = append(fake.getRouteDestinationsArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetRouteDestinationsStub + fakeReturns := fake.getRouteDestinationsReturns fake.recordInvocation("GetRouteDestinations", []interface{}{arg1}) fake.getRouteDestinationsMutex.Unlock() - if fake.GetRouteDestinationsStub != nil { - return fake.GetRouteDestinationsStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getRouteDestinationsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9117,15 +9204,16 @@ func (fake *FakeCloudControllerClient) GetRoutes(arg1 ...ccv3.Query) ([]resource fake.getRoutesArgsForCall = append(fake.getRoutesArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetRoutesStub + fakeReturns := fake.getRoutesReturns fake.recordInvocation("GetRoutes", []interface{}{arg1}) fake.getRoutesMutex.Unlock() - if fake.GetRoutesStub != nil { - return fake.GetRoutesStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getRoutesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9184,15 +9272,16 @@ func (fake *FakeCloudControllerClient) GetRunningSecurityGroups(arg1 string, arg arg1 string arg2 []ccv3.Query }{arg1, arg2}) + stub := fake.GetRunningSecurityGroupsStub + fakeReturns := fake.getRunningSecurityGroupsReturns fake.recordInvocation("GetRunningSecurityGroups", []interface{}{arg1, arg2}) fake.getRunningSecurityGroupsMutex.Unlock() - if fake.GetRunningSecurityGroupsStub != nil { - return fake.GetRunningSecurityGroupsStub(arg1, arg2...) + if stub != nil { + return stub(arg1, arg2...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getRunningSecurityGroupsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9250,15 +9339,16 @@ func (fake *FakeCloudControllerClient) GetSSHEnabled(arg1 string) (ccv3.SSHEnabl fake.getSSHEnabledArgsForCall = append(fake.getSSHEnabledArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetSSHEnabledStub + fakeReturns := fake.getSSHEnabledReturns fake.recordInvocation("GetSSHEnabled", []interface{}{arg1}) fake.getSSHEnabledMutex.Unlock() - if fake.GetSSHEnabledStub != nil { - return fake.GetSSHEnabledStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getSSHEnabledReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9316,15 +9406,16 @@ func (fake *FakeCloudControllerClient) GetSecurityGroups(arg1 ...ccv3.Query) ([] fake.getSecurityGroupsArgsForCall = append(fake.getSecurityGroupsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetSecurityGroupsStub + fakeReturns := fake.getSecurityGroupsReturns fake.recordInvocation("GetSecurityGroups", []interface{}{arg1}) fake.getSecurityGroupsMutex.Unlock() - if fake.GetSecurityGroupsStub != nil { - return fake.GetSecurityGroupsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getSecurityGroupsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9382,15 +9473,16 @@ func (fake *FakeCloudControllerClient) GetServiceBrokers(arg1 ...ccv3.Query) ([] fake.getServiceBrokersArgsForCall = append(fake.getServiceBrokersArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetServiceBrokersStub + fakeReturns := fake.getServiceBrokersReturns fake.recordInvocation("GetServiceBrokers", []interface{}{arg1}) fake.getServiceBrokersMutex.Unlock() - if fake.GetServiceBrokersStub != nil { - return fake.GetServiceBrokersStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServiceBrokersReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9448,15 +9540,16 @@ func (fake *FakeCloudControllerClient) GetServiceCredentialBindingDetails(arg1 s fake.getServiceCredentialBindingDetailsArgsForCall = append(fake.getServiceCredentialBindingDetailsArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetServiceCredentialBindingDetailsStub + fakeReturns := fake.getServiceCredentialBindingDetailsReturns fake.recordInvocation("GetServiceCredentialBindingDetails", []interface{}{arg1}) fake.getServiceCredentialBindingDetailsMutex.Unlock() - if fake.GetServiceCredentialBindingDetailsStub != nil { - return fake.GetServiceCredentialBindingDetailsStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServiceCredentialBindingDetailsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9514,15 +9607,16 @@ func (fake *FakeCloudControllerClient) GetServiceCredentialBindings(arg1 ...ccv3 fake.getServiceCredentialBindingsArgsForCall = append(fake.getServiceCredentialBindingsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetServiceCredentialBindingsStub + fakeReturns := fake.getServiceCredentialBindingsReturns fake.recordInvocation("GetServiceCredentialBindings", []interface{}{arg1}) fake.getServiceCredentialBindingsMutex.Unlock() - if fake.GetServiceCredentialBindingsStub != nil { - return fake.GetServiceCredentialBindingsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServiceCredentialBindingsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9582,15 +9676,16 @@ func (fake *FakeCloudControllerClient) GetServiceInstanceByNameAndSpace(arg1 str arg2 string arg3 []ccv3.Query }{arg1, arg2, arg3}) + stub := fake.GetServiceInstanceByNameAndSpaceStub + fakeReturns := fake.getServiceInstanceByNameAndSpaceReturns fake.recordInvocation("GetServiceInstanceByNameAndSpace", []interface{}{arg1, arg2, arg3}) fake.getServiceInstanceByNameAndSpaceMutex.Unlock() - if fake.GetServiceInstanceByNameAndSpaceStub != nil { - return fake.GetServiceInstanceByNameAndSpaceStub(arg1, arg2, arg3...) + if stub != nil { + return stub(arg1, arg2, arg3...) } if specificReturn { return ret.result1, ret.result2, ret.result3, ret.result4 } - fakeReturns := fake.getServiceInstanceByNameAndSpaceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3, fakeReturns.result4 } @@ -9651,15 +9746,16 @@ func (fake *FakeCloudControllerClient) GetServiceInstanceParameters(arg1 string) fake.getServiceInstanceParametersArgsForCall = append(fake.getServiceInstanceParametersArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetServiceInstanceParametersStub + fakeReturns := fake.getServiceInstanceParametersReturns fake.recordInvocation("GetServiceInstanceParameters", []interface{}{arg1}) fake.getServiceInstanceParametersMutex.Unlock() - if fake.GetServiceInstanceParametersStub != nil { - return fake.GetServiceInstanceParametersStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServiceInstanceParametersReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9717,15 +9813,16 @@ func (fake *FakeCloudControllerClient) GetServiceInstanceSharedSpaces(arg1 strin fake.getServiceInstanceSharedSpacesArgsForCall = append(fake.getServiceInstanceSharedSpacesArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetServiceInstanceSharedSpacesStub + fakeReturns := fake.getServiceInstanceSharedSpacesReturns fake.recordInvocation("GetServiceInstanceSharedSpaces", []interface{}{arg1}) fake.getServiceInstanceSharedSpacesMutex.Unlock() - if fake.GetServiceInstanceSharedSpacesStub != nil { - return fake.GetServiceInstanceSharedSpacesStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServiceInstanceSharedSpacesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9783,15 +9880,16 @@ func (fake *FakeCloudControllerClient) GetServiceInstanceUsageSummary(arg1 strin fake.getServiceInstanceUsageSummaryArgsForCall = append(fake.getServiceInstanceUsageSummaryArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetServiceInstanceUsageSummaryStub + fakeReturns := fake.getServiceInstanceUsageSummaryReturns fake.recordInvocation("GetServiceInstanceUsageSummary", []interface{}{arg1}) fake.getServiceInstanceUsageSummaryMutex.Unlock() - if fake.GetServiceInstanceUsageSummaryStub != nil { - return fake.GetServiceInstanceUsageSummaryStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServiceInstanceUsageSummaryReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9849,15 +9947,16 @@ func (fake *FakeCloudControllerClient) GetServiceInstances(arg1 ...ccv3.Query) ( fake.getServiceInstancesArgsForCall = append(fake.getServiceInstancesArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetServiceInstancesStub + fakeReturns := fake.getServiceInstancesReturns fake.recordInvocation("GetServiceInstances", []interface{}{arg1}) fake.getServiceInstancesMutex.Unlock() - if fake.GetServiceInstancesStub != nil { - return fake.GetServiceInstancesStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3, ret.result4 } - fakeReturns := fake.getServiceInstancesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3, fakeReturns.result4 } @@ -9918,15 +10017,16 @@ func (fake *FakeCloudControllerClient) GetServiceOfferingByGUID(arg1 string) (re fake.getServiceOfferingByGUIDArgsForCall = append(fake.getServiceOfferingByGUIDArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetServiceOfferingByGUIDStub + fakeReturns := fake.getServiceOfferingByGUIDReturns fake.recordInvocation("GetServiceOfferingByGUID", []interface{}{arg1}) fake.getServiceOfferingByGUIDMutex.Unlock() - if fake.GetServiceOfferingByGUIDStub != nil { - return fake.GetServiceOfferingByGUIDStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServiceOfferingByGUIDReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -9985,15 +10085,16 @@ func (fake *FakeCloudControllerClient) GetServiceOfferingByNameAndBroker(arg1 st arg1 string arg2 string }{arg1, arg2}) + stub := fake.GetServiceOfferingByNameAndBrokerStub + fakeReturns := fake.getServiceOfferingByNameAndBrokerReturns fake.recordInvocation("GetServiceOfferingByNameAndBroker", []interface{}{arg1, arg2}) fake.getServiceOfferingByNameAndBrokerMutex.Unlock() - if fake.GetServiceOfferingByNameAndBrokerStub != nil { - return fake.GetServiceOfferingByNameAndBrokerStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServiceOfferingByNameAndBrokerReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10051,15 +10152,16 @@ func (fake *FakeCloudControllerClient) GetServiceOfferings(arg1 ...ccv3.Query) ( fake.getServiceOfferingsArgsForCall = append(fake.getServiceOfferingsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetServiceOfferingsStub + fakeReturns := fake.getServiceOfferingsReturns fake.recordInvocation("GetServiceOfferings", []interface{}{arg1}) fake.getServiceOfferingsMutex.Unlock() - if fake.GetServiceOfferingsStub != nil { - return fake.GetServiceOfferingsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServiceOfferingsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10117,15 +10219,16 @@ func (fake *FakeCloudControllerClient) GetServicePlanByGUID(arg1 string) (resour fake.getServicePlanByGUIDArgsForCall = append(fake.getServicePlanByGUIDArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetServicePlanByGUIDStub + fakeReturns := fake.getServicePlanByGUIDReturns fake.recordInvocation("GetServicePlanByGUID", []interface{}{arg1}) fake.getServicePlanByGUIDMutex.Unlock() - if fake.GetServicePlanByGUIDStub != nil { - return fake.GetServicePlanByGUIDStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServicePlanByGUIDReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10183,15 +10286,16 @@ func (fake *FakeCloudControllerClient) GetServicePlanVisibility(arg1 string) (re fake.getServicePlanVisibilityArgsForCall = append(fake.getServicePlanVisibilityArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetServicePlanVisibilityStub + fakeReturns := fake.getServicePlanVisibilityReturns fake.recordInvocation("GetServicePlanVisibility", []interface{}{arg1}) fake.getServicePlanVisibilityMutex.Unlock() - if fake.GetServicePlanVisibilityStub != nil { - return fake.GetServicePlanVisibilityStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServicePlanVisibilityReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10249,15 +10353,16 @@ func (fake *FakeCloudControllerClient) GetServicePlans(arg1 ...ccv3.Query) ([]re fake.getServicePlansArgsForCall = append(fake.getServicePlansArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetServicePlansStub + fakeReturns := fake.getServicePlansReturns fake.recordInvocation("GetServicePlans", []interface{}{arg1}) fake.getServicePlansMutex.Unlock() - if fake.GetServicePlansStub != nil { - return fake.GetServicePlansStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServicePlansReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10315,15 +10420,16 @@ func (fake *FakeCloudControllerClient) GetServicePlansWithOfferings(arg1 ...ccv3 fake.getServicePlansWithOfferingsArgsForCall = append(fake.getServicePlansWithOfferingsArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetServicePlansWithOfferingsStub + fakeReturns := fake.getServicePlansWithOfferingsReturns fake.recordInvocation("GetServicePlansWithOfferings", []interface{}{arg1}) fake.getServicePlansWithOfferingsMutex.Unlock() - if fake.GetServicePlansWithOfferingsStub != nil { - return fake.GetServicePlansWithOfferingsStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServicePlansWithOfferingsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10381,15 +10487,16 @@ func (fake *FakeCloudControllerClient) GetServicePlansWithSpaceAndOrganization(a fake.getServicePlansWithSpaceAndOrganizationArgsForCall = append(fake.getServicePlansWithSpaceAndOrganizationArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetServicePlansWithSpaceAndOrganizationStub + fakeReturns := fake.getServicePlansWithSpaceAndOrganizationReturns fake.recordInvocation("GetServicePlansWithSpaceAndOrganization", []interface{}{arg1}) fake.getServicePlansWithSpaceAndOrganizationMutex.Unlock() - if fake.GetServicePlansWithSpaceAndOrganizationStub != nil { - return fake.GetServicePlansWithSpaceAndOrganizationStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getServicePlansWithSpaceAndOrganizationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10448,15 +10555,16 @@ func (fake *FakeCloudControllerClient) GetSpaceFeature(arg1 string, arg2 string) arg1 string arg2 string }{arg1, arg2}) + stub := fake.GetSpaceFeatureStub + fakeReturns := fake.getSpaceFeatureReturns fake.recordInvocation("GetSpaceFeature", []interface{}{arg1, arg2}) fake.getSpaceFeatureMutex.Unlock() - if fake.GetSpaceFeatureStub != nil { - return fake.GetSpaceFeatureStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getSpaceFeatureReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10514,15 +10622,16 @@ func (fake *FakeCloudControllerClient) GetSpaceIsolationSegment(arg1 string) (re fake.getSpaceIsolationSegmentArgsForCall = append(fake.getSpaceIsolationSegmentArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetSpaceIsolationSegmentStub + fakeReturns := fake.getSpaceIsolationSegmentReturns fake.recordInvocation("GetSpaceIsolationSegment", []interface{}{arg1}) fake.getSpaceIsolationSegmentMutex.Unlock() - if fake.GetSpaceIsolationSegmentStub != nil { - return fake.GetSpaceIsolationSegmentStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getSpaceIsolationSegmentReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10586,15 +10695,16 @@ func (fake *FakeCloudControllerClient) GetSpaceManifestDiff(arg1 string, arg2 [] arg1 string arg2 []byte }{arg1, arg2Copy}) + stub := fake.GetSpaceManifestDiffStub + fakeReturns := fake.getSpaceManifestDiffReturns fake.recordInvocation("GetSpaceManifestDiff", []interface{}{arg1, arg2Copy}) fake.getSpaceManifestDiffMutex.Unlock() - if fake.GetSpaceManifestDiffStub != nil { - return fake.GetSpaceManifestDiffStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getSpaceManifestDiffReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10652,15 +10762,16 @@ func (fake *FakeCloudControllerClient) GetSpaceQuota(arg1 string) (resources.Spa fake.getSpaceQuotaArgsForCall = append(fake.getSpaceQuotaArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetSpaceQuotaStub + fakeReturns := fake.getSpaceQuotaReturns fake.recordInvocation("GetSpaceQuota", []interface{}{arg1}) fake.getSpaceQuotaMutex.Unlock() - if fake.GetSpaceQuotaStub != nil { - return fake.GetSpaceQuotaStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getSpaceQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10718,15 +10829,16 @@ func (fake *FakeCloudControllerClient) GetSpaceQuotas(arg1 ...ccv3.Query) ([]res fake.getSpaceQuotasArgsForCall = append(fake.getSpaceQuotasArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetSpaceQuotasStub + fakeReturns := fake.getSpaceQuotasReturns fake.recordInvocation("GetSpaceQuotas", []interface{}{arg1}) fake.getSpaceQuotasMutex.Unlock() - if fake.GetSpaceQuotasStub != nil { - return fake.GetSpaceQuotasStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getSpaceQuotasReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10784,15 +10896,16 @@ func (fake *FakeCloudControllerClient) GetSpaces(arg1 ...ccv3.Query) ([]resource fake.getSpacesArgsForCall = append(fake.getSpacesArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetSpacesStub + fakeReturns := fake.getSpacesReturns fake.recordInvocation("GetSpaces", []interface{}{arg1}) fake.getSpacesMutex.Unlock() - if fake.GetSpacesStub != nil { - return fake.GetSpacesStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3, ret.result4 } - fakeReturns := fake.getSpacesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3, fakeReturns.result4 } @@ -10853,15 +10966,16 @@ func (fake *FakeCloudControllerClient) GetStacks(arg1 ...ccv3.Query) ([]resource fake.getStacksArgsForCall = append(fake.getStacksArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetStacksStub + fakeReturns := fake.getStacksReturns fake.recordInvocation("GetStacks", []interface{}{arg1}) fake.getStacksMutex.Unlock() - if fake.GetStacksStub != nil { - return fake.GetStacksStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getStacksReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10920,15 +11034,16 @@ func (fake *FakeCloudControllerClient) GetStagingSecurityGroups(arg1 string, arg arg1 string arg2 []ccv3.Query }{arg1, arg2}) + stub := fake.GetStagingSecurityGroupsStub + fakeReturns := fake.getStagingSecurityGroupsReturns fake.recordInvocation("GetStagingSecurityGroups", []interface{}{arg1, arg2}) fake.getStagingSecurityGroupsMutex.Unlock() - if fake.GetStagingSecurityGroupsStub != nil { - return fake.GetStagingSecurityGroupsStub(arg1, arg2...) + if stub != nil { + return stub(arg1, arg2...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getStagingSecurityGroupsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -10986,15 +11101,16 @@ func (fake *FakeCloudControllerClient) GetTask(arg1 string) (resources.Task, ccv fake.getTaskArgsForCall = append(fake.getTaskArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetTaskStub + fakeReturns := fake.getTaskReturns fake.recordInvocation("GetTask", []interface{}{arg1}) fake.getTaskMutex.Unlock() - if fake.GetTaskStub != nil { - return fake.GetTaskStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getTaskReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -11052,15 +11168,16 @@ func (fake *FakeCloudControllerClient) GetUser(arg1 string) (resources.User, ccv fake.getUserArgsForCall = append(fake.getUserArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetUserStub + fakeReturns := fake.getUserReturns fake.recordInvocation("GetUser", []interface{}{arg1}) fake.getUserMutex.Unlock() - if fake.GetUserStub != nil { - return fake.GetUserStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getUserReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -11118,15 +11235,16 @@ func (fake *FakeCloudControllerClient) GetUsers(arg1 ...ccv3.Query) ([]resources fake.getUsersArgsForCall = append(fake.getUsersArgsForCall, struct { arg1 []ccv3.Query }{arg1}) + stub := fake.GetUsersStub + fakeReturns := fake.getUsersReturns fake.recordInvocation("GetUsers", []interface{}{arg1}) fake.getUsersMutex.Unlock() - if fake.GetUsersStub != nil { - return fake.GetUsersStub(arg1...) + if stub != nil { + return stub(arg1...) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getUsersReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -11192,15 +11310,16 @@ func (fake *FakeCloudControllerClient) MakeRequestSendReceiveRaw(arg1 string, ar arg3 http.Header arg4 []byte }{arg1, arg2, arg3, arg4Copy}) + stub := fake.MakeRequestSendReceiveRawStub + fakeReturns := fake.makeRequestSendReceiveRawReturns fake.recordInvocation("MakeRequestSendReceiveRaw", []interface{}{arg1, arg2, arg3, arg4Copy}) fake.makeRequestSendReceiveRawMutex.Unlock() - if fake.MakeRequestSendReceiveRawStub != nil { - return fake.MakeRequestSendReceiveRawStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.makeRequestSendReceiveRawReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -11260,15 +11379,16 @@ func (fake *FakeCloudControllerClient) MapRoute(arg1 string, arg2 string, arg3 s arg2 string arg3 string }{arg1, arg2, arg3}) + stub := fake.MapRouteStub + fakeReturns := fake.mapRouteReturns fake.recordInvocation("MapRoute", []interface{}{arg1, arg2, arg3}) fake.mapRouteMutex.Unlock() - if fake.MapRouteStub != nil { - return fake.MapRouteStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.mapRouteReturns return fakeReturns.result1, fakeReturns.result2 } @@ -11324,15 +11444,16 @@ func (fake *FakeCloudControllerClient) MoveRoute(arg1 string, arg2 string) (ccv3 arg1 string arg2 string }{arg1, arg2}) + stub := fake.MoveRouteStub + fakeReturns := fake.moveRouteReturns fake.recordInvocation("MoveRoute", []interface{}{arg1, arg2}) fake.moveRouteMutex.Unlock() - if fake.MoveRouteStub != nil { - return fake.MoveRouteStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.moveRouteReturns return fakeReturns.result1, fakeReturns.result2 } @@ -11387,15 +11508,16 @@ func (fake *FakeCloudControllerClient) PollJob(arg1 ccv3.JobURL) (ccv3.Warnings, fake.pollJobArgsForCall = append(fake.pollJobArgsForCall, struct { arg1 ccv3.JobURL }{arg1}) + stub := fake.PollJobStub + fakeReturns := fake.pollJobReturns fake.recordInvocation("PollJob", []interface{}{arg1}) fake.pollJobMutex.Unlock() - if fake.PollJobStub != nil { - return fake.PollJobStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.pollJobReturns return fakeReturns.result1, fakeReturns.result2 } @@ -11451,15 +11573,16 @@ func (fake *FakeCloudControllerClient) PollJobForState(arg1 ccv3.JobURL, arg2 co arg1 ccv3.JobURL arg2 constant.JobState }{arg1, arg2}) + stub := fake.PollJobForStateStub + fakeReturns := fake.pollJobForStateReturns fake.recordInvocation("PollJobForState", []interface{}{arg1, arg2}) fake.pollJobForStateMutex.Unlock() - if fake.PollJobForStateStub != nil { - return fake.PollJobForStateStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.pollJobForStateReturns return fakeReturns.result1, fakeReturns.result2 } @@ -11514,15 +11637,16 @@ func (fake *FakeCloudControllerClient) PollJobToEventStream(arg1 ccv3.JobURL) ch fake.pollJobToEventStreamArgsForCall = append(fake.pollJobToEventStreamArgsForCall, struct { arg1 ccv3.JobURL }{arg1}) + stub := fake.PollJobToEventStreamStub + fakeReturns := fake.pollJobToEventStreamReturns fake.recordInvocation("PollJobToEventStream", []interface{}{arg1}) fake.pollJobToEventStreamMutex.Unlock() - if fake.PollJobToEventStreamStub != nil { - return fake.PollJobToEventStreamStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1 } - fakeReturns := fake.pollJobToEventStreamReturns return fakeReturns.result1 } @@ -11574,15 +11698,16 @@ func (fake *FakeCloudControllerClient) PurgeServiceOffering(arg1 string) (ccv3.W fake.purgeServiceOfferingArgsForCall = append(fake.purgeServiceOfferingArgsForCall, struct { arg1 string }{arg1}) + stub := fake.PurgeServiceOfferingStub + fakeReturns := fake.purgeServiceOfferingReturns fake.recordInvocation("PurgeServiceOffering", []interface{}{arg1}) fake.purgeServiceOfferingMutex.Unlock() - if fake.PurgeServiceOfferingStub != nil { - return fake.PurgeServiceOfferingStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.purgeServiceOfferingReturns return fakeReturns.result1, fakeReturns.result2 } @@ -11642,15 +11767,16 @@ func (fake *FakeCloudControllerClient) ResourceMatch(arg1 []ccv3.Resource) ([]cc fake.resourceMatchArgsForCall = append(fake.resourceMatchArgsForCall, struct { arg1 []ccv3.Resource }{arg1Copy}) + stub := fake.ResourceMatchStub + fakeReturns := fake.resourceMatchReturns fake.recordInvocation("ResourceMatch", []interface{}{arg1Copy}) fake.resourceMatchMutex.Unlock() - if fake.ResourceMatchStub != nil { - return fake.ResourceMatchStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.resourceMatchReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -11707,15 +11833,16 @@ func (fake *FakeCloudControllerClient) RootResponse() (ccv3.Info, ccv3.Warnings, ret, specificReturn := fake.rootResponseReturnsOnCall[len(fake.rootResponseArgsForCall)] fake.rootResponseArgsForCall = append(fake.rootResponseArgsForCall, struct { }{}) + stub := fake.RootResponseStub + fakeReturns := fake.rootResponseReturns fake.recordInvocation("RootResponse", []interface{}{}) fake.rootResponseMutex.Unlock() - if fake.RootResponseStub != nil { - return fake.RootResponseStub() + if stub != nil { + return stub() } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.rootResponseReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -11767,15 +11894,16 @@ func (fake *FakeCloudControllerClient) SetApplicationDroplet(arg1 string, arg2 s arg1 string arg2 string }{arg1, arg2}) + stub := fake.SetApplicationDropletStub + fakeReturns := fake.setApplicationDropletReturns fake.recordInvocation("SetApplicationDroplet", []interface{}{arg1, arg2}) fake.setApplicationDropletMutex.Unlock() - if fake.SetApplicationDropletStub != nil { - return fake.SetApplicationDropletStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.setApplicationDropletReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -11834,15 +11962,16 @@ func (fake *FakeCloudControllerClient) SharePrivateDomainToOrgs(arg1 string, arg arg1 string arg2 ccv3.SharedOrgs }{arg1, arg2}) + stub := fake.SharePrivateDomainToOrgsStub + fakeReturns := fake.sharePrivateDomainToOrgsReturns fake.recordInvocation("SharePrivateDomainToOrgs", []interface{}{arg1, arg2}) fake.sharePrivateDomainToOrgsMutex.Unlock() - if fake.SharePrivateDomainToOrgsStub != nil { - return fake.SharePrivateDomainToOrgsStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.sharePrivateDomainToOrgsReturns return fakeReturns.result1, fakeReturns.result2 } @@ -11898,15 +12027,16 @@ func (fake *FakeCloudControllerClient) ShareRoute(arg1 string, arg2 string) (ccv arg1 string arg2 string }{arg1, arg2}) + stub := fake.ShareRouteStub + fakeReturns := fake.shareRouteReturns fake.recordInvocation("ShareRoute", []interface{}{arg1, arg2}) fake.shareRouteMutex.Unlock() - if fake.ShareRouteStub != nil { - return fake.ShareRouteStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.shareRouteReturns return fakeReturns.result1, fakeReturns.result2 } @@ -11967,15 +12097,16 @@ func (fake *FakeCloudControllerClient) ShareServiceInstanceToSpaces(arg1 string, arg1 string arg2 []string }{arg1, arg2Copy}) + stub := fake.ShareServiceInstanceToSpacesStub + fakeReturns := fake.shareServiceInstanceToSpacesReturns fake.recordInvocation("ShareServiceInstanceToSpaces", []interface{}{arg1, arg2Copy}) fake.shareServiceInstanceToSpacesMutex.Unlock() - if fake.ShareServiceInstanceToSpacesStub != nil { - return fake.ShareServiceInstanceToSpacesStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.shareServiceInstanceToSpacesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -12032,9 +12163,10 @@ func (fake *FakeCloudControllerClient) TargetCF(arg1 ccv3.TargetSettings) { fake.targetCFArgsForCall = append(fake.targetCFArgsForCall, struct { arg1 ccv3.TargetSettings }{arg1}) + stub := fake.TargetCFStub fake.recordInvocation("TargetCF", []interface{}{arg1}) fake.targetCFMutex.Unlock() - if fake.TargetCFStub != nil { + if stub != nil { fake.TargetCFStub(arg1) } } @@ -12065,15 +12197,16 @@ func (fake *FakeCloudControllerClient) UnbindSecurityGroupRunningSpace(arg1 stri arg1 string arg2 string }{arg1, arg2}) + stub := fake.UnbindSecurityGroupRunningSpaceStub + fakeReturns := fake.unbindSecurityGroupRunningSpaceReturns fake.recordInvocation("UnbindSecurityGroupRunningSpace", []interface{}{arg1, arg2}) fake.unbindSecurityGroupRunningSpaceMutex.Unlock() - if fake.UnbindSecurityGroupRunningSpaceStub != nil { - return fake.UnbindSecurityGroupRunningSpaceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.unbindSecurityGroupRunningSpaceReturns return fakeReturns.result1, fakeReturns.result2 } @@ -12129,15 +12262,16 @@ func (fake *FakeCloudControllerClient) UnbindSecurityGroupStagingSpace(arg1 stri arg1 string arg2 string }{arg1, arg2}) + stub := fake.UnbindSecurityGroupStagingSpaceStub + fakeReturns := fake.unbindSecurityGroupStagingSpaceReturns fake.recordInvocation("UnbindSecurityGroupStagingSpace", []interface{}{arg1, arg2}) fake.unbindSecurityGroupStagingSpaceMutex.Unlock() - if fake.UnbindSecurityGroupStagingSpaceStub != nil { - return fake.UnbindSecurityGroupStagingSpaceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.unbindSecurityGroupStagingSpaceReturns return fakeReturns.result1, fakeReturns.result2 } @@ -12193,15 +12327,16 @@ func (fake *FakeCloudControllerClient) UnmapRoute(arg1 string, arg2 string) (ccv arg1 string arg2 string }{arg1, arg2}) + stub := fake.UnmapRouteStub + fakeReturns := fake.unmapRouteReturns fake.recordInvocation("UnmapRoute", []interface{}{arg1, arg2}) fake.unmapRouteMutex.Unlock() - if fake.UnmapRouteStub != nil { - return fake.UnmapRouteStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.unmapRouteReturns return fakeReturns.result1, fakeReturns.result2 } @@ -12257,15 +12392,16 @@ func (fake *FakeCloudControllerClient) UnsetSpaceQuota(arg1 string, arg2 string) arg1 string arg2 string }{arg1, arg2}) + stub := fake.UnsetSpaceQuotaStub + fakeReturns := fake.unsetSpaceQuotaReturns fake.recordInvocation("UnsetSpaceQuota", []interface{}{arg1, arg2}) fake.unsetSpaceQuotaMutex.Unlock() - if fake.UnsetSpaceQuotaStub != nil { - return fake.UnsetSpaceQuotaStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.unsetSpaceQuotaReturns return fakeReturns.result1, fakeReturns.result2 } @@ -12321,15 +12457,16 @@ func (fake *FakeCloudControllerClient) UnsharePrivateDomainFromOrg(arg1 string, arg1 string arg2 string }{arg1, arg2}) + stub := fake.UnsharePrivateDomainFromOrgStub + fakeReturns := fake.unsharePrivateDomainFromOrgReturns fake.recordInvocation("UnsharePrivateDomainFromOrg", []interface{}{arg1, arg2}) fake.unsharePrivateDomainFromOrgMutex.Unlock() - if fake.UnsharePrivateDomainFromOrgStub != nil { - return fake.UnsharePrivateDomainFromOrgStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.unsharePrivateDomainFromOrgReturns return fakeReturns.result1, fakeReturns.result2 } @@ -12385,15 +12522,16 @@ func (fake *FakeCloudControllerClient) UnshareRoute(arg1 string, arg2 string) (c arg1 string arg2 string }{arg1, arg2}) + stub := fake.UnshareRouteStub + fakeReturns := fake.unshareRouteReturns fake.recordInvocation("UnshareRoute", []interface{}{arg1, arg2}) fake.unshareRouteMutex.Unlock() - if fake.UnshareRouteStub != nil { - return fake.UnshareRouteStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.unshareRouteReturns return fakeReturns.result1, fakeReturns.result2 } @@ -12449,15 +12587,16 @@ func (fake *FakeCloudControllerClient) UnshareServiceInstanceFromSpace(arg1 stri arg1 string arg2 string }{arg1, arg2}) + stub := fake.UnshareServiceInstanceFromSpaceStub + fakeReturns := fake.unshareServiceInstanceFromSpaceReturns fake.recordInvocation("UnshareServiceInstanceFromSpace", []interface{}{arg1, arg2}) fake.unshareServiceInstanceFromSpaceMutex.Unlock() - if fake.UnshareServiceInstanceFromSpaceStub != nil { - return fake.UnshareServiceInstanceFromSpaceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.unshareServiceInstanceFromSpaceReturns return fakeReturns.result1, fakeReturns.result2 } @@ -12514,15 +12653,16 @@ func (fake *FakeCloudControllerClient) UpdateAppFeature(arg1 string, arg2 bool, arg2 bool arg3 string }{arg1, arg2, arg3}) + stub := fake.UpdateAppFeatureStub + fakeReturns := fake.updateAppFeatureReturns fake.recordInvocation("UpdateAppFeature", []interface{}{arg1, arg2, arg3}) fake.updateAppFeatureMutex.Unlock() - if fake.UpdateAppFeatureStub != nil { - return fake.UpdateAppFeatureStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.updateAppFeatureReturns return fakeReturns.result1, fakeReturns.result2 } @@ -12577,15 +12717,16 @@ func (fake *FakeCloudControllerClient) UpdateApplication(arg1 resources.Applicat fake.updateApplicationArgsForCall = append(fake.updateApplicationArgsForCall, struct { arg1 resources.Application }{arg1}) + stub := fake.UpdateApplicationStub + fakeReturns := fake.updateApplicationReturns fake.recordInvocation("UpdateApplication", []interface{}{arg1}) fake.updateApplicationMutex.Unlock() - if fake.UpdateApplicationStub != nil { - return fake.UpdateApplicationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateApplicationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -12649,15 +12790,16 @@ func (fake *FakeCloudControllerClient) UpdateApplicationApplyManifest(arg1 strin arg1 string arg2 []byte }{arg1, arg2Copy}) + stub := fake.UpdateApplicationApplyManifestStub + fakeReturns := fake.updateApplicationApplyManifestReturns fake.recordInvocation("UpdateApplicationApplyManifest", []interface{}{arg1, arg2Copy}) fake.updateApplicationApplyManifestMutex.Unlock() - if fake.UpdateApplicationApplyManifestStub != nil { - return fake.UpdateApplicationApplyManifestStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateApplicationApplyManifestReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -12716,15 +12858,16 @@ func (fake *FakeCloudControllerClient) UpdateApplicationEnvironmentVariables(arg arg1 string arg2 resources.EnvironmentVariables }{arg1, arg2}) + stub := fake.UpdateApplicationEnvironmentVariablesStub + fakeReturns := fake.updateApplicationEnvironmentVariablesReturns fake.recordInvocation("UpdateApplicationEnvironmentVariables", []interface{}{arg1, arg2}) fake.updateApplicationEnvironmentVariablesMutex.Unlock() - if fake.UpdateApplicationEnvironmentVariablesStub != nil { - return fake.UpdateApplicationEnvironmentVariablesStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateApplicationEnvironmentVariablesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -12783,15 +12926,16 @@ func (fake *FakeCloudControllerClient) UpdateApplicationName(arg1 string, arg2 s arg1 string arg2 string }{arg1, arg2}) + stub := fake.UpdateApplicationNameStub + fakeReturns := fake.updateApplicationNameReturns fake.recordInvocation("UpdateApplicationName", []interface{}{arg1, arg2}) fake.updateApplicationNameMutex.Unlock() - if fake.UpdateApplicationNameStub != nil { - return fake.UpdateApplicationNameStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateApplicationNameReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -12849,15 +12993,16 @@ func (fake *FakeCloudControllerClient) UpdateApplicationRestart(arg1 string) (re fake.updateApplicationRestartArgsForCall = append(fake.updateApplicationRestartArgsForCall, struct { arg1 string }{arg1}) + stub := fake.UpdateApplicationRestartStub + fakeReturns := fake.updateApplicationRestartReturns fake.recordInvocation("UpdateApplicationRestart", []interface{}{arg1}) fake.updateApplicationRestartMutex.Unlock() - if fake.UpdateApplicationRestartStub != nil { - return fake.UpdateApplicationRestartStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateApplicationRestartReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -12915,15 +13060,16 @@ func (fake *FakeCloudControllerClient) UpdateApplicationStart(arg1 string) (reso fake.updateApplicationStartArgsForCall = append(fake.updateApplicationStartArgsForCall, struct { arg1 string }{arg1}) + stub := fake.UpdateApplicationStartStub + fakeReturns := fake.updateApplicationStartReturns fake.recordInvocation("UpdateApplicationStart", []interface{}{arg1}) fake.updateApplicationStartMutex.Unlock() - if fake.UpdateApplicationStartStub != nil { - return fake.UpdateApplicationStartStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateApplicationStartReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -12981,15 +13127,16 @@ func (fake *FakeCloudControllerClient) UpdateApplicationStop(arg1 string) (resou fake.updateApplicationStopArgsForCall = append(fake.updateApplicationStopArgsForCall, struct { arg1 string }{arg1}) + stub := fake.UpdateApplicationStopStub + fakeReturns := fake.updateApplicationStopReturns fake.recordInvocation("UpdateApplicationStop", []interface{}{arg1}) fake.updateApplicationStopMutex.Unlock() - if fake.UpdateApplicationStopStub != nil { - return fake.UpdateApplicationStopStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateApplicationStopReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13047,15 +13194,16 @@ func (fake *FakeCloudControllerClient) UpdateBuildpack(arg1 resources.Buildpack) fake.updateBuildpackArgsForCall = append(fake.updateBuildpackArgsForCall, struct { arg1 resources.Buildpack }{arg1}) + stub := fake.UpdateBuildpackStub + fakeReturns := fake.updateBuildpackReturns fake.recordInvocation("UpdateBuildpack", []interface{}{arg1}) fake.updateBuildpackMutex.Unlock() - if fake.UpdateBuildpackStub != nil { - return fake.UpdateBuildpackStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateBuildpackReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13115,15 +13263,16 @@ func (fake *FakeCloudControllerClient) UpdateDestination(arg1 string, arg2 strin arg2 string arg3 string }{arg1, arg2, arg3}) + stub := fake.UpdateDestinationStub + fakeReturns := fake.updateDestinationReturns fake.recordInvocation("UpdateDestination", []interface{}{arg1, arg2, arg3}) fake.updateDestinationMutex.Unlock() - if fake.UpdateDestinationStub != nil { - return fake.UpdateDestinationStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.updateDestinationReturns return fakeReturns.result1, fakeReturns.result2 } @@ -13179,15 +13328,16 @@ func (fake *FakeCloudControllerClient) UpdateEnvironmentVariableGroup(arg1 const arg1 constant.EnvironmentVariableGroupName arg2 resources.EnvironmentVariables }{arg1, arg2}) + stub := fake.UpdateEnvironmentVariableGroupStub + fakeReturns := fake.updateEnvironmentVariableGroupReturns fake.recordInvocation("UpdateEnvironmentVariableGroup", []interface{}{arg1, arg2}) fake.updateEnvironmentVariableGroupMutex.Unlock() - if fake.UpdateEnvironmentVariableGroupStub != nil { - return fake.UpdateEnvironmentVariableGroupStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateEnvironmentVariableGroupReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13245,15 +13395,16 @@ func (fake *FakeCloudControllerClient) UpdateFeatureFlag(arg1 resources.FeatureF fake.updateFeatureFlagArgsForCall = append(fake.updateFeatureFlagArgsForCall, struct { arg1 resources.FeatureFlag }{arg1}) + stub := fake.UpdateFeatureFlagStub + fakeReturns := fake.updateFeatureFlagReturns fake.recordInvocation("UpdateFeatureFlag", []interface{}{arg1}) fake.updateFeatureFlagMutex.Unlock() - if fake.UpdateFeatureFlagStub != nil { - return fake.UpdateFeatureFlagStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateFeatureFlagReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13311,15 +13462,16 @@ func (fake *FakeCloudControllerClient) UpdateOrganization(arg1 resources.Organiz fake.updateOrganizationArgsForCall = append(fake.updateOrganizationArgsForCall, struct { arg1 resources.Organization }{arg1}) + stub := fake.UpdateOrganizationStub + fakeReturns := fake.updateOrganizationReturns fake.recordInvocation("UpdateOrganization", []interface{}{arg1}) fake.updateOrganizationMutex.Unlock() - if fake.UpdateOrganizationStub != nil { - return fake.UpdateOrganizationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateOrganizationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13378,15 +13530,16 @@ func (fake *FakeCloudControllerClient) UpdateOrganizationDefaultIsolationSegment arg1 string arg2 string }{arg1, arg2}) + stub := fake.UpdateOrganizationDefaultIsolationSegmentRelationshipStub + fakeReturns := fake.updateOrganizationDefaultIsolationSegmentRelationshipReturns fake.recordInvocation("UpdateOrganizationDefaultIsolationSegmentRelationship", []interface{}{arg1, arg2}) fake.updateOrganizationDefaultIsolationSegmentRelationshipMutex.Unlock() - if fake.UpdateOrganizationDefaultIsolationSegmentRelationshipStub != nil { - return fake.UpdateOrganizationDefaultIsolationSegmentRelationshipStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateOrganizationDefaultIsolationSegmentRelationshipReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13444,15 +13597,16 @@ func (fake *FakeCloudControllerClient) UpdateOrganizationQuota(arg1 resources.Or fake.updateOrganizationQuotaArgsForCall = append(fake.updateOrganizationQuotaArgsForCall, struct { arg1 resources.OrganizationQuota }{arg1}) + stub := fake.UpdateOrganizationQuotaStub + fakeReturns := fake.updateOrganizationQuotaReturns fake.recordInvocation("UpdateOrganizationQuota", []interface{}{arg1}) fake.updateOrganizationQuotaMutex.Unlock() - if fake.UpdateOrganizationQuotaStub != nil { - return fake.UpdateOrganizationQuotaStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateOrganizationQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13510,15 +13664,16 @@ func (fake *FakeCloudControllerClient) UpdateProcess(arg1 resources.Process) (re fake.updateProcessArgsForCall = append(fake.updateProcessArgsForCall, struct { arg1 resources.Process }{arg1}) + stub := fake.UpdateProcessStub + fakeReturns := fake.updateProcessReturns fake.recordInvocation("UpdateProcess", []interface{}{arg1}) fake.updateProcessMutex.Unlock() - if fake.UpdateProcessStub != nil { - return fake.UpdateProcessStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateProcessReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13578,15 +13733,16 @@ func (fake *FakeCloudControllerClient) UpdateResourceMetadata(arg1 string, arg2 arg2 string arg3 resources.Metadata }{arg1, arg2, arg3}) + stub := fake.UpdateResourceMetadataStub + fakeReturns := fake.updateResourceMetadataReturns fake.recordInvocation("UpdateResourceMetadata", []interface{}{arg1, arg2, arg3}) fake.updateResourceMetadataMutex.Unlock() - if fake.UpdateResourceMetadataStub != nil { - return fake.UpdateResourceMetadataStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateResourceMetadataReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13644,15 +13800,16 @@ func (fake *FakeCloudControllerClient) UpdateSecurityGroup(arg1 resources.Securi fake.updateSecurityGroupArgsForCall = append(fake.updateSecurityGroupArgsForCall, struct { arg1 resources.SecurityGroup }{arg1}) + stub := fake.UpdateSecurityGroupStub + fakeReturns := fake.updateSecurityGroupReturns fake.recordInvocation("UpdateSecurityGroup", []interface{}{arg1}) fake.updateSecurityGroupMutex.Unlock() - if fake.UpdateSecurityGroupStub != nil { - return fake.UpdateSecurityGroupStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateSecurityGroupReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13716,15 +13873,16 @@ func (fake *FakeCloudControllerClient) UpdateSecurityGroupRunningSpace(arg1 stri arg1 string arg2 []string }{arg1, arg2Copy}) + stub := fake.UpdateSecurityGroupRunningSpaceStub + fakeReturns := fake.updateSecurityGroupRunningSpaceReturns fake.recordInvocation("UpdateSecurityGroupRunningSpace", []interface{}{arg1, arg2Copy}) fake.updateSecurityGroupRunningSpaceMutex.Unlock() - if fake.UpdateSecurityGroupRunningSpaceStub != nil { - return fake.UpdateSecurityGroupRunningSpaceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.updateSecurityGroupRunningSpaceReturns return fakeReturns.result1, fakeReturns.result2 } @@ -13785,15 +13943,16 @@ func (fake *FakeCloudControllerClient) UpdateSecurityGroupStagingSpace(arg1 stri arg1 string arg2 []string }{arg1, arg2Copy}) + stub := fake.UpdateSecurityGroupStagingSpaceStub + fakeReturns := fake.updateSecurityGroupStagingSpaceReturns fake.recordInvocation("UpdateSecurityGroupStagingSpace", []interface{}{arg1, arg2Copy}) fake.updateSecurityGroupStagingSpaceMutex.Unlock() - if fake.UpdateSecurityGroupStagingSpaceStub != nil { - return fake.UpdateSecurityGroupStagingSpaceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.updateSecurityGroupStagingSpaceReturns return fakeReturns.result1, fakeReturns.result2 } @@ -13849,15 +14008,16 @@ func (fake *FakeCloudControllerClient) UpdateServiceBroker(arg1 string, arg2 res arg1 string arg2 resources.ServiceBroker }{arg1, arg2}) + stub := fake.UpdateServiceBrokerStub + fakeReturns := fake.updateServiceBrokerReturns fake.recordInvocation("UpdateServiceBroker", []interface{}{arg1, arg2}) fake.updateServiceBrokerMutex.Unlock() - if fake.UpdateServiceBrokerStub != nil { - return fake.UpdateServiceBrokerStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateServiceBrokerReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13916,15 +14076,16 @@ func (fake *FakeCloudControllerClient) UpdateServiceInstance(arg1 string, arg2 r arg1 string arg2 resources.ServiceInstance }{arg1, arg2}) + stub := fake.UpdateServiceInstanceStub + fakeReturns := fake.updateServiceInstanceReturns fake.recordInvocation("UpdateServiceInstance", []interface{}{arg1, arg2}) fake.updateServiceInstanceMutex.Unlock() - if fake.UpdateServiceInstanceStub != nil { - return fake.UpdateServiceInstanceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateServiceInstanceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -13983,15 +14144,16 @@ func (fake *FakeCloudControllerClient) UpdateServicePlanVisibility(arg1 string, arg1 string arg2 resources.ServicePlanVisibility }{arg1, arg2}) + stub := fake.UpdateServicePlanVisibilityStub + fakeReturns := fake.updateServicePlanVisibilityReturns fake.recordInvocation("UpdateServicePlanVisibility", []interface{}{arg1, arg2}) fake.updateServicePlanVisibilityMutex.Unlock() - if fake.UpdateServicePlanVisibilityStub != nil { - return fake.UpdateServicePlanVisibilityStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateServicePlanVisibilityReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14049,15 +14211,16 @@ func (fake *FakeCloudControllerClient) UpdateSpace(arg1 resources.Space) (resour fake.updateSpaceArgsForCall = append(fake.updateSpaceArgsForCall, struct { arg1 resources.Space }{arg1}) + stub := fake.UpdateSpaceStub + fakeReturns := fake.updateSpaceReturns fake.recordInvocation("UpdateSpace", []interface{}{arg1}) fake.updateSpaceMutex.Unlock() - if fake.UpdateSpaceStub != nil { - return fake.UpdateSpaceStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateSpaceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14121,15 +14284,16 @@ func (fake *FakeCloudControllerClient) UpdateSpaceApplyManifest(arg1 string, arg arg1 string arg2 []byte }{arg1, arg2Copy}) + stub := fake.UpdateSpaceApplyManifestStub + fakeReturns := fake.updateSpaceApplyManifestReturns fake.recordInvocation("UpdateSpaceApplyManifest", []interface{}{arg1, arg2Copy}) fake.updateSpaceApplyManifestMutex.Unlock() - if fake.UpdateSpaceApplyManifestStub != nil { - return fake.UpdateSpaceApplyManifestStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateSpaceApplyManifestReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14189,15 +14353,16 @@ func (fake *FakeCloudControllerClient) UpdateSpaceFeature(arg1 string, arg2 bool arg2 bool arg3 string }{arg1, arg2, arg3}) + stub := fake.UpdateSpaceFeatureStub + fakeReturns := fake.updateSpaceFeatureReturns fake.recordInvocation("UpdateSpaceFeature", []interface{}{arg1, arg2, arg3}) fake.updateSpaceFeatureMutex.Unlock() - if fake.UpdateSpaceFeatureStub != nil { - return fake.UpdateSpaceFeatureStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.updateSpaceFeatureReturns return fakeReturns.result1, fakeReturns.result2 } @@ -14253,15 +14418,16 @@ func (fake *FakeCloudControllerClient) UpdateSpaceIsolationSegmentRelationship(a arg1 string arg2 string }{arg1, arg2}) + stub := fake.UpdateSpaceIsolationSegmentRelationshipStub + fakeReturns := fake.updateSpaceIsolationSegmentRelationshipReturns fake.recordInvocation("UpdateSpaceIsolationSegmentRelationship", []interface{}{arg1, arg2}) fake.updateSpaceIsolationSegmentRelationshipMutex.Unlock() - if fake.UpdateSpaceIsolationSegmentRelationshipStub != nil { - return fake.UpdateSpaceIsolationSegmentRelationshipStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateSpaceIsolationSegmentRelationshipReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14319,15 +14485,16 @@ func (fake *FakeCloudControllerClient) UpdateSpaceQuota(arg1 resources.SpaceQuot fake.updateSpaceQuotaArgsForCall = append(fake.updateSpaceQuotaArgsForCall, struct { arg1 resources.SpaceQuota }{arg1}) + stub := fake.UpdateSpaceQuotaStub + fakeReturns := fake.updateSpaceQuotaReturns fake.recordInvocation("UpdateSpaceQuota", []interface{}{arg1}) fake.updateSpaceQuotaMutex.Unlock() - if fake.UpdateSpaceQuotaStub != nil { - return fake.UpdateSpaceQuotaStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateSpaceQuotaReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14385,15 +14552,16 @@ func (fake *FakeCloudControllerClient) UpdateTaskCancel(arg1 string) (resources. fake.updateTaskCancelArgsForCall = append(fake.updateTaskCancelArgsForCall, struct { arg1 string }{arg1}) + stub := fake.UpdateTaskCancelStub + fakeReturns := fake.updateTaskCancelReturns fake.recordInvocation("UpdateTaskCancel", []interface{}{arg1}) fake.updateTaskCancelMutex.Unlock() - if fake.UpdateTaskCancelStub != nil { - return fake.UpdateTaskCancelStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateTaskCancelReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14459,15 +14627,16 @@ func (fake *FakeCloudControllerClient) UploadBitsPackage(arg1 resources.Package, arg3 io.Reader arg4 int64 }{arg1, arg2Copy, arg3, arg4}) + stub := fake.UploadBitsPackageStub + fakeReturns := fake.uploadBitsPackageReturns fake.recordInvocation("UploadBitsPackage", []interface{}{arg1, arg2Copy, arg3, arg4}) fake.uploadBitsPackageMutex.Unlock() - if fake.UploadBitsPackageStub != nil { - return fake.UploadBitsPackageStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.uploadBitsPackageReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14528,15 +14697,16 @@ func (fake *FakeCloudControllerClient) UploadBuildpack(arg1 string, arg2 string, arg3 io.Reader arg4 int64 }{arg1, arg2, arg3, arg4}) + stub := fake.UploadBuildpackStub + fakeReturns := fake.uploadBuildpackReturns fake.recordInvocation("UploadBuildpack", []interface{}{arg1, arg2, arg3, arg4}) fake.uploadBuildpackMutex.Unlock() - if fake.UploadBuildpackStub != nil { - return fake.UploadBuildpackStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.uploadBuildpackReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14597,15 +14767,16 @@ func (fake *FakeCloudControllerClient) UploadDropletBits(arg1 string, arg2 strin arg3 io.Reader arg4 int64 }{arg1, arg2, arg3, arg4}) + stub := fake.UploadDropletBitsStub + fakeReturns := fake.uploadDropletBitsReturns fake.recordInvocation("UploadDropletBits", []interface{}{arg1, arg2, arg3, arg4}) fake.uploadDropletBitsMutex.Unlock() - if fake.UploadDropletBitsStub != nil { - return fake.UploadDropletBitsStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.uploadDropletBitsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14664,15 +14835,16 @@ func (fake *FakeCloudControllerClient) UploadPackage(arg1 resources.Package, arg arg1 resources.Package arg2 string }{arg1, arg2}) + stub := fake.UploadPackageStub + fakeReturns := fake.uploadPackageReturns fake.recordInvocation("UploadPackage", []interface{}{arg1, arg2}) fake.uploadPackageMutex.Unlock() - if fake.UploadPackageStub != nil { - return fake.UploadPackageStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.uploadPackageReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14729,15 +14901,16 @@ func (fake *FakeCloudControllerClient) WhoAmI() (resources.K8sUser, ccv3.Warning ret, specificReturn := fake.whoAmIReturnsOnCall[len(fake.whoAmIArgsForCall)] fake.whoAmIArgsForCall = append(fake.whoAmIArgsForCall, struct { }{}) + stub := fake.WhoAmIStub + fakeReturns := fake.whoAmIReturns fake.recordInvocation("WhoAmI", []interface{}{}) fake.whoAmIMutex.Unlock() - if fake.WhoAmIStub != nil { - return fake.WhoAmIStub() + if stub != nil { + return stub() } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.whoAmIReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -14793,14 +14966,14 @@ func (fake *FakeCloudControllerClient) Invocations() map[string][][]interface{} defer fake.cancelDeploymentMutex.RUnlock() fake.checkRouteMutex.RLock() defer fake.checkRouteMutex.RUnlock() + fake.continueDeploymentMutex.RLock() + defer fake.continueDeploymentMutex.RUnlock() fake.copyPackageMutex.RLock() defer fake.copyPackageMutex.RUnlock() fake.createApplicationMutex.RLock() defer fake.createApplicationMutex.RUnlock() fake.createApplicationDeploymentMutex.RLock() defer fake.createApplicationDeploymentMutex.RUnlock() - fake.createApplicationDeploymentByRevisionMutex.RLock() - defer fake.createApplicationDeploymentByRevisionMutex.RUnlock() fake.createApplicationProcessScaleMutex.RLock() defer fake.createApplicationProcessScaleMutex.RUnlock() fake.createApplicationTaskMutex.RLock() diff --git a/actor/v7pushaction/create_deployment_for_push_plan.go b/actor/v7pushaction/create_deployment_for_push_plan.go index 7d5b7ce1a27..241568f8141 100644 --- a/actor/v7pushaction/create_deployment_for_push_plan.go +++ b/actor/v7pushaction/create_deployment_for_push_plan.go @@ -1,9 +1,18 @@ package v7pushaction +import ( + "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" + "code.cloudfoundry.org/cli/resources" +) + func (actor Actor) CreateDeploymentForApplication(pushPlan PushPlan, eventStream chan<- *PushEvent, progressBar ProgressBar) (PushPlan, Warnings, error) { eventStream <- &PushEvent{Plan: pushPlan, Event: StartingDeployment} - deploymentGUID, warnings, err := actor.V7Actor.CreateDeploymentByApplicationAndDroplet(pushPlan.Application.GUID, pushPlan.DropletGUID) + var dep resources.Deployment + dep.DropletGUID = pushPlan.DropletGUID + dep.Strategy = pushPlan.Strategy + dep.Relationships = resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: pushPlan.Application.GUID}} + deploymentGUID, warnings, err := actor.V7Actor.CreateDeployment(dep) if err != nil { return pushPlan, Warnings(warnings), err @@ -19,7 +28,7 @@ func (actor Actor) CreateDeploymentForApplication(pushPlan PushPlan, eventStream } } - pollWarnings, err := actor.V7Actor.PollStartForRolling(pushPlan.Application, deploymentGUID, pushPlan.NoWait, handleInstanceDetails) + pollWarnings, err := actor.V7Actor.PollStartForDeployment(pushPlan.Application, deploymentGUID, pushPlan.NoWait, handleInstanceDetails) warnings = append(warnings, pollWarnings...) return pushPlan, Warnings(warnings), err diff --git a/actor/v7pushaction/create_deployment_for_push_plan_test.go b/actor/v7pushaction/create_deployment_for_push_plan_test.go index 126eb5dc094..9bbcfa30578 100644 --- a/actor/v7pushaction/create_deployment_for_push_plan_test.go +++ b/actor/v7pushaction/create_deployment_for_push_plan_test.go @@ -47,12 +47,12 @@ var _ = Describe("CreateDeploymentForApplication()", func() { Describe("creating deployment", func() { When("creating the deployment is successful", func() { BeforeEach(func() { - fakeV7Actor.PollStartForRollingCalls(func(_ resources.Application, _ string, _ bool, handleInstanceDetails func(string)) (warnings v7action.Warnings, err error) { + fakeV7Actor.PollStartForDeploymentCalls(func(_ resources.Application, _ string, _ bool, handleInstanceDetails func(string)) (warnings v7action.Warnings, err error) { handleInstanceDetails("Instances starting...") return nil, nil }) - fakeV7Actor.CreateDeploymentByApplicationAndDropletReturns( + fakeV7Actor.CreateDeploymentReturns( "some-deployment-guid", v7action.Warnings{"some-deployment-warning"}, nil, @@ -60,8 +60,8 @@ var _ = Describe("CreateDeploymentForApplication()", func() { }) It("waits for the app to start", func() { - Expect(fakeV7Actor.PollStartForRollingCallCount()).To(Equal(1)) - givenApp, givenDeploymentGUID, noWait, _ := fakeV7Actor.PollStartForRollingArgsForCall(0) + Expect(fakeV7Actor.PollStartForDeploymentCallCount()).To(Equal(1)) + givenApp, givenDeploymentGUID, noWait, _ := fakeV7Actor.PollStartForDeploymentArgsForCall(0) Expect(givenApp).To(Equal(resources.Application{GUID: "some-app-guid"})) Expect(givenDeploymentGUID).To(Equal("some-deployment-guid")) Expect(noWait).To(Equal(false)) @@ -85,7 +85,7 @@ var _ = Describe("CreateDeploymentForApplication()", func() { BeforeEach(func() { someErr = errors.New("failed to create deployment") - fakeV7Actor.CreateDeploymentByApplicationAndDropletReturns( + fakeV7Actor.CreateDeploymentReturns( "", v7action.Warnings{"some-deployment-warning"}, someErr, @@ -93,7 +93,7 @@ var _ = Describe("CreateDeploymentForApplication()", func() { }) It("does not wait for the app to start", func() { - Expect(fakeV7Actor.PollStartForRollingCallCount()).To(Equal(0)) + Expect(fakeV7Actor.PollStartForDeploymentCallCount()).To(Equal(0)) }) It("returns errors and warnings", func() { @@ -111,7 +111,7 @@ var _ = Describe("CreateDeploymentForApplication()", func() { Describe("waiting for app to start", func() { When("the the polling is successful", func() { BeforeEach(func() { - fakeV7Actor.PollStartForRollingReturns(v7action.Warnings{"some-poll-start-warning"}, nil) + fakeV7Actor.PollStartForDeploymentReturns(v7action.Warnings{"some-poll-start-warning"}, nil) }) It("returns warnings and unchanged push plan", func() { @@ -129,7 +129,7 @@ var _ = Describe("CreateDeploymentForApplication()", func() { BeforeEach(func() { someErr = errors.New("app failed to start") - fakeV7Actor.PollStartForRollingReturns(v7action.Warnings{"some-poll-start-warning"}, someErr) + fakeV7Actor.PollStartForDeploymentReturns(v7action.Warnings{"some-poll-start-warning"}, someErr) }) It("returns errors and warnings", func() { @@ -148,7 +148,7 @@ var _ = Describe("CreateDeploymentForApplication()", func() { }) It("passes in the noWait flag", func() { - _, _, noWait, _ := fakeV7Actor.PollStartForRollingArgsForCall(0) + _, _, noWait, _ := fakeV7Actor.PollStartForDeploymentArgsForCall(0) Expect(noWait).To(Equal(true)) }) }) diff --git a/actor/v7pushaction/sequence.go b/actor/v7pushaction/sequence.go index b8e4608fe70..1f9aa741a7f 100644 --- a/actor/v7pushaction/sequence.go +++ b/actor/v7pushaction/sequence.go @@ -21,7 +21,7 @@ func ShouldStagePackage(plan PushPlan) bool { } func ShouldCreateDeployment(plan PushPlan) bool { - return plan.Strategy == constant.DeploymentStrategyRolling + return plan.Strategy != "" } func ShouldStopApplication(plan PushPlan) bool { diff --git a/actor/v7pushaction/sequence_test.go b/actor/v7pushaction/sequence_test.go index 158725f66c5..5274516b04c 100644 --- a/actor/v7pushaction/sequence_test.go +++ b/actor/v7pushaction/sequence_test.go @@ -113,6 +113,18 @@ var _ = Describe("Actor", func() { }) }) + When("the plan has strategy 'canary'", func() { + BeforeEach(func() { + plan = PushPlan{ + Strategy: constant.DeploymentStrategyCanary, + } + }) + + It("returns a sequence that creates a canary deployment", func() { + Expect(sequence).To(matchers.MatchFuncsByName(actor.StagePackageForApplication, actor.CreateDeploymentForApplication)) + }) + }) + When("the plan has task application type", func() { BeforeEach(func() { plan = PushPlan{ diff --git a/actor/v7pushaction/v7_actor.go b/actor/v7pushaction/v7_actor.go index db59052da50..91356c9df46 100644 --- a/actor/v7pushaction/v7_actor.go +++ b/actor/v7pushaction/v7_actor.go @@ -14,7 +14,7 @@ type V7Actor interface { CreateApplicationDroplet(appGUID string) (resources.Droplet, v7action.Warnings, error) CreateApplicationInSpace(app resources.Application, spaceGUID string) (resources.Application, v7action.Warnings, error) CreateBitsPackageByApplication(appGUID string) (resources.Package, v7action.Warnings, error) - CreateDeploymentByApplicationAndDroplet(appGUID string, dropletGUID string) (string, v7action.Warnings, error) + CreateDeployment(dep resources.Deployment) (string, v7action.Warnings, error) CreateDockerPackageByApplication(appGUID string, dockerImageCredentials v7action.DockerImageCredentials) (resources.Package, v7action.Warnings, error) CreateRoute(spaceGUID, domainName, hostname, path string, port int) (resources.Route, v7action.Warnings, error) GetApplicationByNameAndSpace(appName string, spaceGUID string) (resources.Application, v7action.Warnings, error) @@ -29,7 +29,7 @@ type V7Actor interface { PollBuild(buildGUID string, appName string) (resources.Droplet, v7action.Warnings, error) PollPackage(pkg resources.Package) (resources.Package, v7action.Warnings, error) PollStart(app resources.Application, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) - PollStartForRolling(app resources.Application, deploymentGUID string, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) + PollStartForDeployment(app resources.Application, deploymentGUID string, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) ResourceMatch(resources []sharedaction.V3Resource) ([]sharedaction.V3Resource, v7action.Warnings, error) RestartApplication(appGUID string, noWait bool) (v7action.Warnings, error) ScaleProcessByApplication(appGUID string, process resources.Process) (v7action.Warnings, error) diff --git a/actor/v7pushaction/v7pushactionfakes/fake_v7actor.go b/actor/v7pushaction/v7pushactionfakes/fake_v7actor.go index c9e8539321e..76d8d4d185d 100644 --- a/actor/v7pushaction/v7pushactionfakes/fake_v7actor.go +++ b/actor/v7pushaction/v7pushactionfakes/fake_v7actor.go @@ -58,18 +58,17 @@ type FakeV7Actor struct { result2 v7action.Warnings result3 error } - CreateDeploymentByApplicationAndDropletStub func(string, string) (string, v7action.Warnings, error) - createDeploymentByApplicationAndDropletMutex sync.RWMutex - createDeploymentByApplicationAndDropletArgsForCall []struct { - arg1 string - arg2 string + CreateDeploymentStub func(resources.Deployment) (string, v7action.Warnings, error) + createDeploymentMutex sync.RWMutex + createDeploymentArgsForCall []struct { + arg1 resources.Deployment } - createDeploymentByApplicationAndDropletReturns struct { + createDeploymentReturns struct { result1 string result2 v7action.Warnings result3 error } - createDeploymentByApplicationAndDropletReturnsOnCall map[int]struct { + createDeploymentReturnsOnCall map[int]struct { result1 string result2 v7action.Warnings result3 error @@ -295,19 +294,19 @@ type FakeV7Actor struct { result1 v7action.Warnings result2 error } - PollStartForRollingStub func(resources.Application, string, bool, func(string)) (v7action.Warnings, error) - pollStartForRollingMutex sync.RWMutex - pollStartForRollingArgsForCall []struct { + PollStartForDeploymentStub func(resources.Application, string, bool, func(string)) (v7action.Warnings, error) + pollStartForDeploymentMutex sync.RWMutex + pollStartForDeploymentArgsForCall []struct { arg1 resources.Application arg2 string arg3 bool arg4 func(string) } - pollStartForRollingReturns struct { + pollStartForDeploymentReturns struct { result1 v7action.Warnings result2 error } - pollStartForRollingReturnsOnCall map[int]struct { + pollStartForDeploymentReturnsOnCall map[int]struct { result1 v7action.Warnings result2 error } @@ -512,15 +511,16 @@ func (fake *FakeV7Actor) CreateApplicationDroplet(arg1 string) (resources.Drople fake.createApplicationDropletArgsForCall = append(fake.createApplicationDropletArgsForCall, struct { arg1 string }{arg1}) + stub := fake.CreateApplicationDropletStub + fakeReturns := fake.createApplicationDropletReturns fake.recordInvocation("CreateApplicationDroplet", []interface{}{arg1}) fake.createApplicationDropletMutex.Unlock() - if fake.CreateApplicationDropletStub != nil { - return fake.CreateApplicationDropletStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createApplicationDropletReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -579,15 +579,16 @@ func (fake *FakeV7Actor) CreateApplicationInSpace(arg1 resources.Application, ar arg1 resources.Application arg2 string }{arg1, arg2}) + stub := fake.CreateApplicationInSpaceStub + fakeReturns := fake.createApplicationInSpaceReturns fake.recordInvocation("CreateApplicationInSpace", []interface{}{arg1, arg2}) fake.createApplicationInSpaceMutex.Unlock() - if fake.CreateApplicationInSpaceStub != nil { - return fake.CreateApplicationInSpaceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createApplicationInSpaceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -645,15 +646,16 @@ func (fake *FakeV7Actor) CreateBitsPackageByApplication(arg1 string) (resources. fake.createBitsPackageByApplicationArgsForCall = append(fake.createBitsPackageByApplicationArgsForCall, struct { arg1 string }{arg1}) + stub := fake.CreateBitsPackageByApplicationStub + fakeReturns := fake.createBitsPackageByApplicationReturns fake.recordInvocation("CreateBitsPackageByApplication", []interface{}{arg1}) fake.createBitsPackageByApplicationMutex.Unlock() - if fake.CreateBitsPackageByApplicationStub != nil { - return fake.CreateBitsPackageByApplicationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createBitsPackageByApplicationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -705,67 +707,67 @@ func (fake *FakeV7Actor) CreateBitsPackageByApplicationReturnsOnCall(i int, resu }{result1, result2, result3} } -func (fake *FakeV7Actor) CreateDeploymentByApplicationAndDroplet(arg1 string, arg2 string) (string, v7action.Warnings, error) { - fake.createDeploymentByApplicationAndDropletMutex.Lock() - ret, specificReturn := fake.createDeploymentByApplicationAndDropletReturnsOnCall[len(fake.createDeploymentByApplicationAndDropletArgsForCall)] - fake.createDeploymentByApplicationAndDropletArgsForCall = append(fake.createDeploymentByApplicationAndDropletArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - fake.recordInvocation("CreateDeploymentByApplicationAndDroplet", []interface{}{arg1, arg2}) - fake.createDeploymentByApplicationAndDropletMutex.Unlock() - if fake.CreateDeploymentByApplicationAndDropletStub != nil { - return fake.CreateDeploymentByApplicationAndDropletStub(arg1, arg2) +func (fake *FakeV7Actor) CreateDeployment(arg1 resources.Deployment) (string, v7action.Warnings, error) { + fake.createDeploymentMutex.Lock() + ret, specificReturn := fake.createDeploymentReturnsOnCall[len(fake.createDeploymentArgsForCall)] + fake.createDeploymentArgsForCall = append(fake.createDeploymentArgsForCall, struct { + arg1 resources.Deployment + }{arg1}) + stub := fake.CreateDeploymentStub + fakeReturns := fake.createDeploymentReturns + fake.recordInvocation("CreateDeployment", []interface{}{arg1}) + fake.createDeploymentMutex.Unlock() + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createDeploymentByApplicationAndDropletReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } -func (fake *FakeV7Actor) CreateDeploymentByApplicationAndDropletCallCount() int { - fake.createDeploymentByApplicationAndDropletMutex.RLock() - defer fake.createDeploymentByApplicationAndDropletMutex.RUnlock() - return len(fake.createDeploymentByApplicationAndDropletArgsForCall) +func (fake *FakeV7Actor) CreateDeploymentCallCount() int { + fake.createDeploymentMutex.RLock() + defer fake.createDeploymentMutex.RUnlock() + return len(fake.createDeploymentArgsForCall) } -func (fake *FakeV7Actor) CreateDeploymentByApplicationAndDropletCalls(stub func(string, string) (string, v7action.Warnings, error)) { - fake.createDeploymentByApplicationAndDropletMutex.Lock() - defer fake.createDeploymentByApplicationAndDropletMutex.Unlock() - fake.CreateDeploymentByApplicationAndDropletStub = stub +func (fake *FakeV7Actor) CreateDeploymentCalls(stub func(resources.Deployment) (string, v7action.Warnings, error)) { + fake.createDeploymentMutex.Lock() + defer fake.createDeploymentMutex.Unlock() + fake.CreateDeploymentStub = stub } -func (fake *FakeV7Actor) CreateDeploymentByApplicationAndDropletArgsForCall(i int) (string, string) { - fake.createDeploymentByApplicationAndDropletMutex.RLock() - defer fake.createDeploymentByApplicationAndDropletMutex.RUnlock() - argsForCall := fake.createDeploymentByApplicationAndDropletArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 +func (fake *FakeV7Actor) CreateDeploymentArgsForCall(i int) resources.Deployment { + fake.createDeploymentMutex.RLock() + defer fake.createDeploymentMutex.RUnlock() + argsForCall := fake.createDeploymentArgsForCall[i] + return argsForCall.arg1 } -func (fake *FakeV7Actor) CreateDeploymentByApplicationAndDropletReturns(result1 string, result2 v7action.Warnings, result3 error) { - fake.createDeploymentByApplicationAndDropletMutex.Lock() - defer fake.createDeploymentByApplicationAndDropletMutex.Unlock() - fake.CreateDeploymentByApplicationAndDropletStub = nil - fake.createDeploymentByApplicationAndDropletReturns = struct { +func (fake *FakeV7Actor) CreateDeploymentReturns(result1 string, result2 v7action.Warnings, result3 error) { + fake.createDeploymentMutex.Lock() + defer fake.createDeploymentMutex.Unlock() + fake.CreateDeploymentStub = nil + fake.createDeploymentReturns = struct { result1 string result2 v7action.Warnings result3 error }{result1, result2, result3} } -func (fake *FakeV7Actor) CreateDeploymentByApplicationAndDropletReturnsOnCall(i int, result1 string, result2 v7action.Warnings, result3 error) { - fake.createDeploymentByApplicationAndDropletMutex.Lock() - defer fake.createDeploymentByApplicationAndDropletMutex.Unlock() - fake.CreateDeploymentByApplicationAndDropletStub = nil - if fake.createDeploymentByApplicationAndDropletReturnsOnCall == nil { - fake.createDeploymentByApplicationAndDropletReturnsOnCall = make(map[int]struct { +func (fake *FakeV7Actor) CreateDeploymentReturnsOnCall(i int, result1 string, result2 v7action.Warnings, result3 error) { + fake.createDeploymentMutex.Lock() + defer fake.createDeploymentMutex.Unlock() + fake.CreateDeploymentStub = nil + if fake.createDeploymentReturnsOnCall == nil { + fake.createDeploymentReturnsOnCall = make(map[int]struct { result1 string result2 v7action.Warnings result3 error }) } - fake.createDeploymentByApplicationAndDropletReturnsOnCall[i] = struct { + fake.createDeploymentReturnsOnCall[i] = struct { result1 string result2 v7action.Warnings result3 error @@ -779,15 +781,16 @@ func (fake *FakeV7Actor) CreateDockerPackageByApplication(arg1 string, arg2 v7ac arg1 string arg2 v7action.DockerImageCredentials }{arg1, arg2}) + stub := fake.CreateDockerPackageByApplicationStub + fakeReturns := fake.createDockerPackageByApplicationReturns fake.recordInvocation("CreateDockerPackageByApplication", []interface{}{arg1, arg2}) fake.createDockerPackageByApplicationMutex.Unlock() - if fake.CreateDockerPackageByApplicationStub != nil { - return fake.CreateDockerPackageByApplicationStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createDockerPackageByApplicationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -849,15 +852,16 @@ func (fake *FakeV7Actor) CreateRoute(arg1 string, arg2 string, arg3 string, arg4 arg4 string arg5 int }{arg1, arg2, arg3, arg4, arg5}) + stub := fake.CreateRouteStub + fakeReturns := fake.createRouteReturns fake.recordInvocation("CreateRoute", []interface{}{arg1, arg2, arg3, arg4, arg5}) fake.createRouteMutex.Unlock() - if fake.CreateRouteStub != nil { - return fake.CreateRouteStub(arg1, arg2, arg3, arg4, arg5) + if stub != nil { + return stub(arg1, arg2, arg3, arg4, arg5) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.createRouteReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -916,15 +920,16 @@ func (fake *FakeV7Actor) GetApplicationByNameAndSpace(arg1 string, arg2 string) arg1 string arg2 string }{arg1, arg2}) + stub := fake.GetApplicationByNameAndSpaceStub + fakeReturns := fake.getApplicationByNameAndSpaceReturns fake.recordInvocation("GetApplicationByNameAndSpace", []interface{}{arg1, arg2}) fake.getApplicationByNameAndSpaceMutex.Unlock() - if fake.GetApplicationByNameAndSpaceStub != nil { - return fake.GetApplicationByNameAndSpaceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationByNameAndSpaceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -983,15 +988,16 @@ func (fake *FakeV7Actor) GetApplicationDroplets(arg1 string, arg2 string) ([]res arg1 string arg2 string }{arg1, arg2}) + stub := fake.GetApplicationDropletsStub + fakeReturns := fake.getApplicationDropletsReturns fake.recordInvocation("GetApplicationDroplets", []interface{}{arg1, arg2}) fake.getApplicationDropletsMutex.Unlock() - if fake.GetApplicationDropletsStub != nil { - return fake.GetApplicationDropletsStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationDropletsReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -1049,15 +1055,16 @@ func (fake *FakeV7Actor) GetApplicationRoutes(arg1 string) ([]resources.Route, v fake.getApplicationRoutesArgsForCall = append(fake.getApplicationRoutesArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetApplicationRoutesStub + fakeReturns := fake.getApplicationRoutesReturns fake.recordInvocation("GetApplicationRoutes", []interface{}{arg1}) fake.getApplicationRoutesMutex.Unlock() - if fake.GetApplicationRoutesStub != nil { - return fake.GetApplicationRoutesStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationRoutesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -1121,15 +1128,16 @@ func (fake *FakeV7Actor) GetApplicationsByNamesAndSpace(arg1 []string, arg2 stri arg1 []string arg2 string }{arg1Copy, arg2}) + stub := fake.GetApplicationsByNamesAndSpaceStub + fakeReturns := fake.getApplicationsByNamesAndSpaceReturns fake.recordInvocation("GetApplicationsByNamesAndSpace", []interface{}{arg1Copy, arg2}) fake.getApplicationsByNamesAndSpaceMutex.Unlock() - if fake.GetApplicationsByNamesAndSpaceStub != nil { - return fake.GetApplicationsByNamesAndSpaceStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getApplicationsByNamesAndSpaceReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -1187,15 +1195,16 @@ func (fake *FakeV7Actor) GetDefaultDomain(arg1 string) (resources.Domain, v7acti fake.getDefaultDomainArgsForCall = append(fake.getDefaultDomainArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetDefaultDomainStub + fakeReturns := fake.getDefaultDomainReturns fake.recordInvocation("GetDefaultDomain", []interface{}{arg1}) fake.getDefaultDomainMutex.Unlock() - if fake.GetDefaultDomainStub != nil { - return fake.GetDefaultDomainStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getDefaultDomainReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -1253,15 +1262,16 @@ func (fake *FakeV7Actor) GetDomain(arg1 string) (resources.Domain, v7action.Warn fake.getDomainArgsForCall = append(fake.getDomainArgsForCall, struct { arg1 string }{arg1}) + stub := fake.GetDomainStub + fakeReturns := fake.getDomainReturns fake.recordInvocation("GetDomain", []interface{}{arg1}) fake.getDomainMutex.Unlock() - if fake.GetDomainStub != nil { - return fake.GetDomainStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getDomainReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -1322,15 +1332,16 @@ func (fake *FakeV7Actor) GetRouteByAttributes(arg1 resources.Domain, arg2 string arg3 string arg4 int }{arg1, arg2, arg3, arg4}) + stub := fake.GetRouteByAttributesStub + fakeReturns := fake.getRouteByAttributesReturns fake.recordInvocation("GetRouteByAttributes", []interface{}{arg1, arg2, arg3, arg4}) fake.getRouteByAttributesMutex.Unlock() - if fake.GetRouteByAttributesStub != nil { - return fake.GetRouteByAttributesStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.getRouteByAttributesReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -1389,15 +1400,16 @@ func (fake *FakeV7Actor) GetRouteDestinationByAppGUID(arg1 resources.Route, arg2 arg1 resources.Route arg2 string }{arg1, arg2}) + stub := fake.GetRouteDestinationByAppGUIDStub + fakeReturns := fake.getRouteDestinationByAppGUIDReturns fake.recordInvocation("GetRouteDestinationByAppGUID", []interface{}{arg1, arg2}) fake.getRouteDestinationByAppGUIDMutex.Unlock() - if fake.GetRouteDestinationByAppGUIDStub != nil { - return fake.GetRouteDestinationByAppGUIDStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.getRouteDestinationByAppGUIDReturns return fakeReturns.result1, fakeReturns.result2 } @@ -1454,15 +1466,16 @@ func (fake *FakeV7Actor) MapRoute(arg1 string, arg2 string, arg3 string) (v7acti arg2 string arg3 string }{arg1, arg2, arg3}) + stub := fake.MapRouteStub + fakeReturns := fake.mapRouteReturns fake.recordInvocation("MapRoute", []interface{}{arg1, arg2, arg3}) fake.mapRouteMutex.Unlock() - if fake.MapRouteStub != nil { - return fake.MapRouteStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.mapRouteReturns return fakeReturns.result1, fakeReturns.result2 } @@ -1518,15 +1531,16 @@ func (fake *FakeV7Actor) PollBuild(arg1 string, arg2 string) (resources.Droplet, arg1 string arg2 string }{arg1, arg2}) + stub := fake.PollBuildStub + fakeReturns := fake.pollBuildReturns fake.recordInvocation("PollBuild", []interface{}{arg1, arg2}) fake.pollBuildMutex.Unlock() - if fake.PollBuildStub != nil { - return fake.PollBuildStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.pollBuildReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -1584,15 +1598,16 @@ func (fake *FakeV7Actor) PollPackage(arg1 resources.Package) (resources.Package, fake.pollPackageArgsForCall = append(fake.pollPackageArgsForCall, struct { arg1 resources.Package }{arg1}) + stub := fake.PollPackageStub + fakeReturns := fake.pollPackageReturns fake.recordInvocation("PollPackage", []interface{}{arg1}) fake.pollPackageMutex.Unlock() - if fake.PollPackageStub != nil { - return fake.PollPackageStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.pollPackageReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -1652,15 +1667,16 @@ func (fake *FakeV7Actor) PollStart(arg1 resources.Application, arg2 bool, arg3 f arg2 bool arg3 func(string) }{arg1, arg2, arg3}) + stub := fake.PollStartStub + fakeReturns := fake.pollStartReturns fake.recordInvocation("PollStart", []interface{}{arg1, arg2, arg3}) fake.pollStartMutex.Unlock() - if fake.PollStartStub != nil { - return fake.PollStartStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.pollStartReturns return fakeReturns.result1, fakeReturns.result2 } @@ -1709,67 +1725,68 @@ func (fake *FakeV7Actor) PollStartReturnsOnCall(i int, result1 v7action.Warnings }{result1, result2} } -func (fake *FakeV7Actor) PollStartForRolling(arg1 resources.Application, arg2 string, arg3 bool, arg4 func(string)) (v7action.Warnings, error) { - fake.pollStartForRollingMutex.Lock() - ret, specificReturn := fake.pollStartForRollingReturnsOnCall[len(fake.pollStartForRollingArgsForCall)] - fake.pollStartForRollingArgsForCall = append(fake.pollStartForRollingArgsForCall, struct { +func (fake *FakeV7Actor) PollStartForDeployment(arg1 resources.Application, arg2 string, arg3 bool, arg4 func(string)) (v7action.Warnings, error) { + fake.pollStartForDeploymentMutex.Lock() + ret, specificReturn := fake.pollStartForDeploymentReturnsOnCall[len(fake.pollStartForDeploymentArgsForCall)] + fake.pollStartForDeploymentArgsForCall = append(fake.pollStartForDeploymentArgsForCall, struct { arg1 resources.Application arg2 string arg3 bool arg4 func(string) }{arg1, arg2, arg3, arg4}) - fake.recordInvocation("PollStartForRolling", []interface{}{arg1, arg2, arg3, arg4}) - fake.pollStartForRollingMutex.Unlock() - if fake.PollStartForRollingStub != nil { - return fake.PollStartForRollingStub(arg1, arg2, arg3, arg4) + stub := fake.PollStartForDeploymentStub + fakeReturns := fake.pollStartForDeploymentReturns + fake.recordInvocation("PollStartForDeployment", []interface{}{arg1, arg2, arg3, arg4}) + fake.pollStartForDeploymentMutex.Unlock() + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.pollStartForRollingReturns return fakeReturns.result1, fakeReturns.result2 } -func (fake *FakeV7Actor) PollStartForRollingCallCount() int { - fake.pollStartForRollingMutex.RLock() - defer fake.pollStartForRollingMutex.RUnlock() - return len(fake.pollStartForRollingArgsForCall) +func (fake *FakeV7Actor) PollStartForDeploymentCallCount() int { + fake.pollStartForDeploymentMutex.RLock() + defer fake.pollStartForDeploymentMutex.RUnlock() + return len(fake.pollStartForDeploymentArgsForCall) } -func (fake *FakeV7Actor) PollStartForRollingCalls(stub func(resources.Application, string, bool, func(string)) (v7action.Warnings, error)) { - fake.pollStartForRollingMutex.Lock() - defer fake.pollStartForRollingMutex.Unlock() - fake.PollStartForRollingStub = stub +func (fake *FakeV7Actor) PollStartForDeploymentCalls(stub func(resources.Application, string, bool, func(string)) (v7action.Warnings, error)) { + fake.pollStartForDeploymentMutex.Lock() + defer fake.pollStartForDeploymentMutex.Unlock() + fake.PollStartForDeploymentStub = stub } -func (fake *FakeV7Actor) PollStartForRollingArgsForCall(i int) (resources.Application, string, bool, func(string)) { - fake.pollStartForRollingMutex.RLock() - defer fake.pollStartForRollingMutex.RUnlock() - argsForCall := fake.pollStartForRollingArgsForCall[i] +func (fake *FakeV7Actor) PollStartForDeploymentArgsForCall(i int) (resources.Application, string, bool, func(string)) { + fake.pollStartForDeploymentMutex.RLock() + defer fake.pollStartForDeploymentMutex.RUnlock() + argsForCall := fake.pollStartForDeploymentArgsForCall[i] return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 } -func (fake *FakeV7Actor) PollStartForRollingReturns(result1 v7action.Warnings, result2 error) { - fake.pollStartForRollingMutex.Lock() - defer fake.pollStartForRollingMutex.Unlock() - fake.PollStartForRollingStub = nil - fake.pollStartForRollingReturns = struct { +func (fake *FakeV7Actor) PollStartForDeploymentReturns(result1 v7action.Warnings, result2 error) { + fake.pollStartForDeploymentMutex.Lock() + defer fake.pollStartForDeploymentMutex.Unlock() + fake.PollStartForDeploymentStub = nil + fake.pollStartForDeploymentReturns = struct { result1 v7action.Warnings result2 error }{result1, result2} } -func (fake *FakeV7Actor) PollStartForRollingReturnsOnCall(i int, result1 v7action.Warnings, result2 error) { - fake.pollStartForRollingMutex.Lock() - defer fake.pollStartForRollingMutex.Unlock() - fake.PollStartForRollingStub = nil - if fake.pollStartForRollingReturnsOnCall == nil { - fake.pollStartForRollingReturnsOnCall = make(map[int]struct { +func (fake *FakeV7Actor) PollStartForDeploymentReturnsOnCall(i int, result1 v7action.Warnings, result2 error) { + fake.pollStartForDeploymentMutex.Lock() + defer fake.pollStartForDeploymentMutex.Unlock() + fake.PollStartForDeploymentStub = nil + if fake.pollStartForDeploymentReturnsOnCall == nil { + fake.pollStartForDeploymentReturnsOnCall = make(map[int]struct { result1 v7action.Warnings result2 error }) } - fake.pollStartForRollingReturnsOnCall[i] = struct { + fake.pollStartForDeploymentReturnsOnCall[i] = struct { result1 v7action.Warnings result2 error }{result1, result2} @@ -1786,15 +1803,16 @@ func (fake *FakeV7Actor) ResourceMatch(arg1 []sharedaction.V3Resource) ([]shared fake.resourceMatchArgsForCall = append(fake.resourceMatchArgsForCall, struct { arg1 []sharedaction.V3Resource }{arg1Copy}) + stub := fake.ResourceMatchStub + fakeReturns := fake.resourceMatchReturns fake.recordInvocation("ResourceMatch", []interface{}{arg1Copy}) fake.resourceMatchMutex.Unlock() - if fake.ResourceMatchStub != nil { - return fake.ResourceMatchStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.resourceMatchReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -1853,15 +1871,16 @@ func (fake *FakeV7Actor) RestartApplication(arg1 string, arg2 bool) (v7action.Wa arg1 string arg2 bool }{arg1, arg2}) + stub := fake.RestartApplicationStub + fakeReturns := fake.restartApplicationReturns fake.recordInvocation("RestartApplication", []interface{}{arg1, arg2}) fake.restartApplicationMutex.Unlock() - if fake.RestartApplicationStub != nil { - return fake.RestartApplicationStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.restartApplicationReturns return fakeReturns.result1, fakeReturns.result2 } @@ -1917,15 +1936,16 @@ func (fake *FakeV7Actor) ScaleProcessByApplication(arg1 string, arg2 resources.P arg1 string arg2 resources.Process }{arg1, arg2}) + stub := fake.ScaleProcessByApplicationStub + fakeReturns := fake.scaleProcessByApplicationReturns fake.recordInvocation("ScaleProcessByApplication", []interface{}{arg1, arg2}) fake.scaleProcessByApplicationMutex.Unlock() - if fake.ScaleProcessByApplicationStub != nil { - return fake.ScaleProcessByApplicationStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.scaleProcessByApplicationReturns return fakeReturns.result1, fakeReturns.result2 } @@ -1981,15 +2001,16 @@ func (fake *FakeV7Actor) SetApplicationDroplet(arg1 string, arg2 string) (v7acti arg1 string arg2 string }{arg1, arg2}) + stub := fake.SetApplicationDropletStub + fakeReturns := fake.setApplicationDropletReturns fake.recordInvocation("SetApplicationDroplet", []interface{}{arg1, arg2}) fake.setApplicationDropletMutex.Unlock() - if fake.SetApplicationDropletStub != nil { - return fake.SetApplicationDropletStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.setApplicationDropletReturns return fakeReturns.result1, fakeReturns.result2 } @@ -2050,15 +2071,16 @@ func (fake *FakeV7Actor) SetApplicationManifest(arg1 string, arg2 []byte) (v7act arg1 string arg2 []byte }{arg1, arg2Copy}) + stub := fake.SetApplicationManifestStub + fakeReturns := fake.setApplicationManifestReturns fake.recordInvocation("SetApplicationManifest", []interface{}{arg1, arg2Copy}) fake.setApplicationManifestMutex.Unlock() - if fake.SetApplicationManifestStub != nil { - return fake.SetApplicationManifestStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.setApplicationManifestReturns return fakeReturns.result1, fakeReturns.result2 } @@ -2119,15 +2141,16 @@ func (fake *FakeV7Actor) SetSpaceManifest(arg1 string, arg2 []byte) (v7action.Wa arg1 string arg2 []byte }{arg1, arg2Copy}) + stub := fake.SetSpaceManifestStub + fakeReturns := fake.setSpaceManifestReturns fake.recordInvocation("SetSpaceManifest", []interface{}{arg1, arg2Copy}) fake.setSpaceManifestMutex.Unlock() - if fake.SetSpaceManifestStub != nil { - return fake.SetSpaceManifestStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.setSpaceManifestReturns return fakeReturns.result1, fakeReturns.result2 } @@ -2182,15 +2205,16 @@ func (fake *FakeV7Actor) StageApplicationPackage(arg1 string) (resources.Build, fake.stageApplicationPackageArgsForCall = append(fake.stageApplicationPackageArgsForCall, struct { arg1 string }{arg1}) + stub := fake.StageApplicationPackageStub + fakeReturns := fake.stageApplicationPackageReturns fake.recordInvocation("StageApplicationPackage", []interface{}{arg1}) fake.stageApplicationPackageMutex.Unlock() - if fake.StageApplicationPackageStub != nil { - return fake.StageApplicationPackageStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.stageApplicationPackageReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -2248,15 +2272,16 @@ func (fake *FakeV7Actor) StopApplication(arg1 string) (v7action.Warnings, error) fake.stopApplicationArgsForCall = append(fake.stopApplicationArgsForCall, struct { arg1 string }{arg1}) + stub := fake.StopApplicationStub + fakeReturns := fake.stopApplicationReturns fake.recordInvocation("StopApplication", []interface{}{arg1}) fake.stopApplicationMutex.Unlock() - if fake.StopApplicationStub != nil { - return fake.StopApplicationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.stopApplicationReturns return fakeReturns.result1, fakeReturns.result2 } @@ -2312,15 +2337,16 @@ func (fake *FakeV7Actor) UnmapRoute(arg1 string, arg2 string) (v7action.Warnings arg1 string arg2 string }{arg1, arg2}) + stub := fake.UnmapRouteStub + fakeReturns := fake.unmapRouteReturns fake.recordInvocation("UnmapRoute", []interface{}{arg1, arg2}) fake.unmapRouteMutex.Unlock() - if fake.UnmapRouteStub != nil { - return fake.UnmapRouteStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.unmapRouteReturns return fakeReturns.result1, fakeReturns.result2 } @@ -2375,15 +2401,16 @@ func (fake *FakeV7Actor) UpdateApplication(arg1 resources.Application) (resource fake.updateApplicationArgsForCall = append(fake.updateApplicationArgsForCall, struct { arg1 resources.Application }{arg1}) + stub := fake.UpdateApplicationStub + fakeReturns := fake.updateApplicationReturns fake.recordInvocation("UpdateApplication", []interface{}{arg1}) fake.updateApplicationMutex.Unlock() - if fake.UpdateApplicationStub != nil { - return fake.UpdateApplicationStub(arg1) + if stub != nil { + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.updateApplicationReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -2443,15 +2470,16 @@ func (fake *FakeV7Actor) UpdateProcessByTypeAndApplication(arg1 string, arg2 str arg2 string arg3 resources.Process }{arg1, arg2, arg3}) + stub := fake.UpdateProcessByTypeAndApplicationStub + fakeReturns := fake.updateProcessByTypeAndApplicationReturns fake.recordInvocation("UpdateProcessByTypeAndApplication", []interface{}{arg1, arg2, arg3}) fake.updateProcessByTypeAndApplicationMutex.Unlock() - if fake.UpdateProcessByTypeAndApplicationStub != nil { - return fake.UpdateProcessByTypeAndApplicationStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.updateProcessByTypeAndApplicationReturns return fakeReturns.result1, fakeReturns.result2 } @@ -2514,15 +2542,16 @@ func (fake *FakeV7Actor) UploadBitsPackage(arg1 resources.Package, arg2 []shared arg3 io.Reader arg4 int64 }{arg1, arg2Copy, arg3, arg4}) + stub := fake.UploadBitsPackageStub + fakeReturns := fake.uploadBitsPackageReturns fake.recordInvocation("UploadBitsPackage", []interface{}{arg1, arg2Copy, arg3, arg4}) fake.uploadBitsPackageMutex.Unlock() - if fake.UploadBitsPackageStub != nil { - return fake.UploadBitsPackageStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2, ret.result3 } - fakeReturns := fake.uploadBitsPackageReturns return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } @@ -2583,15 +2612,16 @@ func (fake *FakeV7Actor) UploadDroplet(arg1 string, arg2 string, arg3 io.Reader, arg3 io.Reader arg4 int64 }{arg1, arg2, arg3, arg4}) + stub := fake.UploadDropletStub + fakeReturns := fake.uploadDropletReturns fake.recordInvocation("UploadDroplet", []interface{}{arg1, arg2, arg3, arg4}) fake.uploadDropletMutex.Unlock() - if fake.UploadDropletStub != nil { - return fake.UploadDropletStub(arg1, arg2, arg3, arg4) + if stub != nil { + return stub(arg1, arg2, arg3, arg4) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.uploadDropletReturns return fakeReturns.result1, fakeReturns.result2 } @@ -2649,8 +2679,8 @@ func (fake *FakeV7Actor) Invocations() map[string][][]interface{} { defer fake.createApplicationInSpaceMutex.RUnlock() fake.createBitsPackageByApplicationMutex.RLock() defer fake.createBitsPackageByApplicationMutex.RUnlock() - fake.createDeploymentByApplicationAndDropletMutex.RLock() - defer fake.createDeploymentByApplicationAndDropletMutex.RUnlock() + fake.createDeploymentMutex.RLock() + defer fake.createDeploymentMutex.RUnlock() fake.createDockerPackageByApplicationMutex.RLock() defer fake.createDockerPackageByApplicationMutex.RUnlock() fake.createRouteMutex.RLock() @@ -2679,8 +2709,8 @@ func (fake *FakeV7Actor) Invocations() map[string][][]interface{} { defer fake.pollPackageMutex.RUnlock() fake.pollStartMutex.RLock() defer fake.pollStartMutex.RUnlock() - fake.pollStartForRollingMutex.RLock() - defer fake.pollStartForRollingMutex.RUnlock() + fake.pollStartForDeploymentMutex.RLock() + defer fake.pollStartForDeploymentMutex.RUnlock() fake.resourceMatchMutex.RLock() defer fake.resourceMatchMutex.RUnlock() fake.restartApplicationMutex.RLock() diff --git a/api/cloudcontroller/ccv3/constant/deployment.go b/api/cloudcontroller/ccv3/constant/deployment.go index f3af1740aa8..2ae6159ebb7 100644 --- a/api/cloudcontroller/ccv3/constant/deployment.go +++ b/api/cloudcontroller/ccv3/constant/deployment.go @@ -5,61 +5,29 @@ package constant type DeploymentState string const ( - // DeploymentDeploying means the deployment is in state 'DEPLOYING' DeploymentDeploying DeploymentState = "DEPLOYING" - - // DeploymentCanceled means the deployment is in state 'CANCELED' - DeploymentCanceled DeploymentState = "CANCELED" - - // DeploymentDeployed means the deployment is in state 'DEPLOYED' - DeploymentDeployed DeploymentState = "DEPLOYED" - - // DeploymentCanceling means the deployment is in state 'CANCELING' + DeploymentCanceled DeploymentState = "CANCELED" + DeploymentDeployed DeploymentState = "DEPLOYED" DeploymentCanceling DeploymentState = "CANCELING" - - // DeploymentFailing means the deployment is in state 'FAILING' - DeploymentFailing DeploymentState = "FAILING" - - // DeploymentFailed means the deployment is in state 'FAILED' - DeploymentFailed DeploymentState = "FAILED" + DeploymentFailing DeploymentState = "FAILING" + DeploymentFailed DeploymentState = "FAILED" ) // DeploymentStatusReason describes the status reasons a deployment can have type DeploymentStatusReason string const ( - // DeploymentStatusReasonDeploying means the deployment is in state 'DEPLOYING' - DeploymentStatusReasonDeploying DeploymentStatusReason = "DEPLOYING" - - // DeploymentCanceled means the deployment is in state 'CANCELING' - DeploymentStatusReasonCanceling DeploymentStatusReason = "CANCELING" - - // DeploymentStatusReasonDeployed means the deployment's status.value is - // 'DEPLOYED' - DeploymentStatusReasonDeployed DeploymentStatusReason = "DEPLOYED" - - // DeploymentStatusReasonCanceled means the deployment's status.value is - // 'CANCELED' - DeploymentStatusReasonCanceled DeploymentStatusReason = "CANCELED" - - // DeploymentStatusReasonSuperseded means the deployment's status.value is - // 'SUPERSEDED' + DeploymentStatusReasonDeploying DeploymentStatusReason = "DEPLOYING" + DeploymentStatusReasonCanceling DeploymentStatusReason = "CANCELING" + DeploymentStatusReasonDeployed DeploymentStatusReason = "DEPLOYED" + DeploymentStatusReasonCanceled DeploymentStatusReason = "CANCELED" DeploymentStatusReasonSuperseded DeploymentStatusReason = "SUPERSEDED" - - // DeploymentStatusReasonPaused means the deployment's status.value is - // 'PAUSED' - DeploymentStatusReasonPaused DeploymentStatusReason = "PAUSED" + DeploymentStatusReasonPaused DeploymentStatusReason = "PAUSED" ) -// DeploymentStatusValue describes the status values a deployment can have type DeploymentStatusValue string const ( - // DeploymentStatusValueActive means the deployment's status.value is - // 'ACTIVE' - DeploymentStatusValueActive DeploymentStatusValue = "ACTIVE" - - // DeploymentStatusValueFinalized means the deployment's status.value is - // 'FINALIZED' + DeploymentStatusValueActive DeploymentStatusValue = "ACTIVE" DeploymentStatusValueFinalized DeploymentStatusValue = "FINALIZED" ) diff --git a/api/cloudcontroller/ccv3/deployment.go b/api/cloudcontroller/ccv3/deployment.go index a4dc7da040f..3d72e47f482 100644 --- a/api/cloudcontroller/ccv3/deployment.go +++ b/api/cloudcontroller/ccv3/deployment.go @@ -1,42 +1,29 @@ package ccv3 import ( - "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/internal" "code.cloudfoundry.org/cli/resources" ) -func (client *Client) CancelDeployment(deploymentGUID string) (Warnings, error) { +func (client *Client) ContinueDeployment(deploymentGUID string) (Warnings, error) { _, warnings, err := client.MakeRequest(RequestParams{ - RequestName: internal.PostApplicationDeploymentActionCancelRequest, + RequestName: internal.PostApplicationDeploymentActionContinueRequest, URIParams: internal.Params{"deployment_guid": deploymentGUID}, }) return warnings, err } -func (client *Client) CreateApplicationDeployment(appGUID string, dropletGUID string) (string, Warnings, error) { - dep := resources.Deployment{ - DropletGUID: dropletGUID, - Relationships: resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: appGUID}}, - } - - var responseBody resources.Deployment - +func (client *Client) CancelDeployment(deploymentGUID string) (Warnings, error) { _, warnings, err := client.MakeRequest(RequestParams{ - RequestName: internal.PostApplicationDeploymentRequest, - RequestBody: dep, - ResponseBody: &responseBody, + RequestName: internal.PostApplicationDeploymentActionCancelRequest, + URIParams: internal.Params{"deployment_guid": deploymentGUID}, }) - return responseBody.GUID, warnings, err + return warnings, err } -func (client *Client) CreateApplicationDeploymentByRevision(appGUID string, revisionGUID string) (string, Warnings, error) { - dep := resources.Deployment{ - RevisionGUID: revisionGUID, - Relationships: resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: appGUID}}, - } +func (client *Client) CreateApplicationDeployment(dep resources.Deployment) (string, Warnings, error) { var responseBody resources.Deployment diff --git a/api/cloudcontroller/ccv3/deployment_test.go b/api/cloudcontroller/ccv3/deployment_test.go index 56f336b1437..ad2099583b1 100644 --- a/api/cloudcontroller/ccv3/deployment_test.go +++ b/api/cloudcontroller/ccv3/deployment_test.go @@ -165,7 +165,7 @@ var _ = Describe("Deployment", func() { }) }) - Describe("CreateApplicationDeployment", func() { + Describe("Create a deployment with app and droplet guids", func() { var ( deploymentGUID string warnings Warnings @@ -174,7 +174,11 @@ var _ = Describe("Deployment", func() { ) JustBeforeEach(func() { - deploymentGUID, warnings, executeErr = client.CreateApplicationDeployment("some-app-guid", dropletGUID) + var dep resources.Deployment + dep.Strategy = constant.DeploymentStrategyRolling + dep.DropletGUID = dropletGUID + dep.Relationships = resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: "some-app-guid"}} + deploymentGUID, warnings, executeErr = client.CreateApplicationDeployment(dep) }) Context("when the application exists", func() { @@ -184,6 +188,7 @@ var _ = Describe("Deployment", func() { response = `{ "guid": "some-deployment-guid", "created_at": "2018-04-25T22:42:10Z", + "strategy": "rolling", "relationships": { "app": { "data": { @@ -199,7 +204,7 @@ var _ = Describe("Deployment", func() { server.AppendHandlers( CombineHandlers( VerifyRequest(http.MethodPost, "/v3/deployments"), - VerifyJSON(`{"droplet":{ "guid":"some-droplet-guid" }, "relationships":{"app":{"data":{"guid":"some-app-guid"}}}}`), + VerifyJSON(`{"droplet":{ "guid":"some-droplet-guid" }, "strategy": "rolling", "relationships":{"app":{"data":{"guid":"some-app-guid"}}}}`), RespondWith(http.StatusAccepted, response, http.Header{"X-Cf-Warnings": {"warning"}}), ), ) @@ -219,7 +224,7 @@ var _ = Describe("Deployment", func() { server.AppendHandlers( CombineHandlers( VerifyRequest(http.MethodPost, "/v3/deployments"), - VerifyJSON(`{"relationships":{"app":{"data":{"guid":"some-app-guid"}}}}`), + VerifyJSON(`{"strategy":"rolling", "relationships":{"app":{"data":{"guid":"some-app-guid"}}}}`), RespondWith(http.StatusAccepted, response, http.Header{"X-Cf-Warnings": {"warning"}}), ), ) @@ -233,7 +238,7 @@ var _ = Describe("Deployment", func() { }) }) - Describe("CreateApplicationDeploymentByRevision", func() { + Describe("Create a deployment with app and revision guids", func() { var ( deploymentGUID string warnings Warnings @@ -242,7 +247,11 @@ var _ = Describe("Deployment", func() { ) JustBeforeEach(func() { - deploymentGUID, warnings, executeErr = client.CreateApplicationDeploymentByRevision("some-app-guid", revisionGUID) + var dep resources.Deployment + dep.Strategy = constant.DeploymentStrategyCanary + dep.RevisionGUID = revisionGUID + dep.Relationships = resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: "some-app-guid"}} + deploymentGUID, warnings, executeErr = client.CreateApplicationDeployment(dep) }) Context("when the application exists", func() { @@ -252,6 +261,7 @@ var _ = Describe("Deployment", func() { response = `{ "guid": "some-deployment-guid", "created_at": "2018-04-25T22:42:10Z", + "strategy": "canary", "relationships": { "app": { "data": { @@ -267,7 +277,7 @@ var _ = Describe("Deployment", func() { server.AppendHandlers( CombineHandlers( VerifyRequest(http.MethodPost, "/v3/deployments"), - VerifyJSON(`{"revision":{ "guid":"some-revision-guid" }, "relationships":{"app":{"data":{"guid":"some-app-guid"}}}}`), + VerifyJSON(`{"revision":{ "guid":"some-revision-guid" }, "strategy": "canary", "relationships":{"app":{"data":{"guid":"some-app-guid"}}}}`), RespondWith(http.StatusAccepted, response, http.Header{"X-Cf-Warnings": {"warning"}}), ), ) @@ -280,6 +290,43 @@ var _ = Describe("Deployment", func() { }) }) }) + + When("the cloud controller version does not support canary deployment", func() { + BeforeEach(func() { + revisionGUID = "some-revision-guid" + response := `{ + "errors": [ + { + "code": 10008, + "detail": "Strategy 'canary' is not a supported deployment strategy", + "title": "CF-UnprocessableEntity" + } + ] +}` + server.AppendHandlers( + CombineHandlers( + VerifyRequest(http.MethodPost, "/v3/deployments"), + VerifyJSON(`{"revision":{ "guid":"some-revision-guid" }, "strategy": "canary", "relationships":{"app":{"data":{"guid":"some-app-guid"}}}}`), + RespondWith(http.StatusTeapot, response, http.Header{}), + ), + ) + }) + + It("returns an error", func() { + fmt.Printf("executeErr: %v\n", executeErr) + Expect(executeErr).To(HaveOccurred()) + Expect(executeErr).To(MatchError(ccerror.V3UnexpectedResponseError{ + ResponseCode: http.StatusTeapot, + V3ErrorResponse: ccerror.V3ErrorResponse{ + Errors: []ccerror.V3Error{{ + Code: 10008, + Detail: "Strategy 'canary' is not a supported deployment strategy", + Title: "CF-UnprocessableEntity", + }}}, + }, + )) + }) + }) }) Describe("GetDeployment", func() { @@ -289,6 +336,7 @@ var _ = Describe("Deployment", func() { response = `{ "guid": "some-deployment-guid", "state": "DEPLOYED", + "strategy": "canary", "status": { "value": "FINALIZED", "reason": "SUPERSEDED" @@ -325,6 +373,7 @@ var _ = Describe("Deployment", func() { Expect(deployment.State).To(Equal(constant.DeploymentDeployed)) Expect(deployment.StatusValue).To(Equal(constant.DeploymentStatusValueFinalized)) Expect(deployment.StatusReason).To(Equal(constant.DeploymentStatusReasonSuperseded)) + Expect(deployment.Strategy).To(Equal(constant.DeploymentStrategyCanary)) }) }) diff --git a/api/cloudcontroller/ccv3/internal/api_routes.go b/api/cloudcontroller/ccv3/internal/api_routes.go index 9f6b3fa1475..05d5607eb33 100644 --- a/api/cloudcontroller/ccv3/internal/api_routes.go +++ b/api/cloudcontroller/ccv3/internal/api_routes.go @@ -137,6 +137,7 @@ const ( PostApplicationActionStartRequest = "PostApplicationActionStart" PostApplicationActionStopRequest = "PostApplicationActionStop" PostApplicationDeploymentActionCancelRequest = "PostApplicationDeploymentActionCancel" + PostApplicationDeploymentActionContinueRequest = "PostApplicationDeploymentActionContinue" PostApplicationDeploymentRequest = "PostApplicationDeployment" PostApplicationProcessActionScaleRequest = "PostApplicationProcessActionScale" PostApplicationRequest = "PostApplication" @@ -218,6 +219,7 @@ var APIRoutes = map[string]Route{ PostApplicationDeploymentRequest: {Path: "/v3/deployments", Method: http.MethodPost}, GetDeploymentRequest: {Path: "/v3/deployments/:deployment_guid", Method: http.MethodGet}, PostApplicationDeploymentActionCancelRequest: {Path: "/v3/deployments/:deployment_guid/actions/cancel", Method: http.MethodPost}, + PostApplicationDeploymentActionContinueRequest: {Path: "/v3/deployments/:deployment_guid/actions/continue", Method: http.MethodPost}, GetDomainsRequest: {Path: "/v3/domains", Method: http.MethodGet}, PostDomainRequest: {Path: "/v3/domains", Method: http.MethodPost}, DeleteDomainRequest: {Path: "/v3/domains/:domain_guid", Method: http.MethodDelete}, diff --git a/command/common/command_list_v7.go b/command/common/command_list_v7.go index 2e1bc07ea5e..d1e86445932 100644 --- a/command/common/command_list_v7.go +++ b/command/common/command_list_v7.go @@ -32,6 +32,7 @@ type commandList struct { CancelDeployment v7.CancelDeploymentCommand `command:"cancel-deployment" description:"Cancel the most recent deployment for an app. Resets the current droplet to the previous deployment's droplet."` CheckRoute v7.CheckRouteCommand `command:"check-route" description:"Perform a check to determine whether a route currently exists or not"` Config v7.ConfigCommand `command:"config" description:"Write default values to the config"` + ContinueDeployment v7.ContinueDeploymentCommand `command:"continue-deployment" description:"Continue the most recent deployment for an app."` CopySource v7.CopySourceCommand `command:"copy-source" description:"Copies the source code of an application to another existing application and restages that application"` CreateApp v7.CreateAppCommand `command:"create-app" description:"Create an Application in the target space"` CreateAppManifest v7.CreateAppManifestCommand `command:"create-app-manifest" description:"Create an app manifest for an app that has been pushed successfully"` diff --git a/command/common/internal/help_all_display.go b/command/common/internal/help_all_display.go index 738f496672e..f2dbcc4c981 100644 --- a/command/common/internal/help_all_display.go +++ b/command/common/internal/help_all_display.go @@ -13,7 +13,7 @@ var HelpCategoryList = []HelpCategory{ CommandList: [][]string{ {"apps", "app", "create-app"}, {"push", "scale", "delete", "rename"}, - {"cancel-deployment"}, + {"cancel-deployment", "continue-deployment"}, {"start", "stop", "restart", "stage-package", "restage", "restart-app-instance"}, {"run-task", "tasks", "terminate-task"}, {"packages", "create-package"}, diff --git a/command/flag/deployment_strategy.go b/command/flag/deployment_strategy.go index 0c7a98bb5e4..47ee1b52ee2 100644 --- a/command/flag/deployment_strategy.go +++ b/command/flag/deployment_strategy.go @@ -12,7 +12,7 @@ type DeploymentStrategy struct { } func (DeploymentStrategy) Complete(prefix string) []flags.Completion { - return completions([]string{string(constant.DeploymentStrategyRolling)}, prefix, false) + return completions([]string{string(constant.DeploymentStrategyRolling), string(constant.DeploymentStrategyCanary)}, prefix, false) } func (h *DeploymentStrategy) UnmarshalFlag(val string) error { @@ -23,13 +23,14 @@ func (h *DeploymentStrategy) UnmarshalFlag(val string) error { case string(constant.DeploymentStrategyDefault): // Do nothing, leave the default value - case string(constant.DeploymentStrategyRolling): + case string(constant.DeploymentStrategyRolling), + string(constant.DeploymentStrategyCanary): h.Name = constant.DeploymentStrategy(valLower) default: return &flags.Error{ Type: flags.ErrInvalidChoice, - Message: `STRATEGY must be "rolling" or not set`, + Message: `STRATEGY must be "canary", "rolling" or not set`, } } diff --git a/command/flag/deployment_strategy_test.go b/command/flag/deployment_strategy_test.go index d8f8ad229a5..90ac3c0b1d5 100644 --- a/command/flag/deployment_strategy_test.go +++ b/command/flag/deployment_strategy_test.go @@ -34,7 +34,7 @@ var _ = Describe("DeploymentStrategy", func() { Expect(strategy.Name).To(Equal(expectedType)) }, Entry("sets 'rolling' when passed 'rolling'", "rolling", constant.DeploymentStrategyRolling), - Entry("sets 'rolling' when passed 'rOlliNg'", "rOlliNg", constant.DeploymentStrategyRolling), + Entry("sets 'rolling' when passed 'cAnaRy'", "cAnaRy", constant.DeploymentStrategyCanary), Entry("sets 'rolling' when passed 'ROLLING'", "ROLLING", constant.DeploymentStrategyRolling), ) @@ -43,7 +43,7 @@ var _ = Describe("DeploymentStrategy", func() { err := strategy.UnmarshalFlag("banana") Expect(err).To(MatchError(&flags.Error{ Type: flags.ErrInvalidChoice, - Message: `STRATEGY must be "rolling" or not set`, + Message: `STRATEGY must be "canary", "rolling" or not set`, })) Expect(strategy.Name).To(BeEmpty()) }) diff --git a/command/v7/actor.go b/command/v7/actor.go index 7617493d79c..ff5303ea855 100644 --- a/command/v7/actor.go +++ b/command/v7/actor.go @@ -27,6 +27,7 @@ type Actor interface { Authenticate(credentials map[string]string, origin string, grantType uaa.GrantType) error BindSecurityGroupToSpaces(securityGroupGUID string, spaces []resources.Space, lifecycle constant.SecurityGroupLifecycle) (v7action.Warnings, error) CancelDeployment(deploymentGUID string) (v7action.Warnings, error) + ContinueDeployment(deploymentGUID string) (v7action.Warnings, error) CheckRoute(domainName string, hostname string, path string, port int) (bool, v7action.Warnings, error) ClearTarget() CopyPackage(sourceApp resources.Application, targetApp resources.Application) (resources.Package, v7action.Warnings, error) @@ -35,8 +36,7 @@ type Actor interface { CreateApplicationInSpace(app resources.Application, spaceGUID string) (resources.Application, v7action.Warnings, error) CreateBitsPackageByApplication(appGUID string) (resources.Package, v7action.Warnings, error) CreateBuildpack(buildpack resources.Buildpack) (resources.Buildpack, v7action.Warnings, error) - CreateDeploymentByApplicationAndDroplet(appGUID string, dropletGUID string) (string, v7action.Warnings, error) - CreateDeploymentByApplicationAndRevision(appGUID string, revisionGUID string) (string, v7action.Warnings, error) + CreateDeployment(dep resources.Deployment) (string, v7action.Warnings, error) CreateDockerPackageByApplication(appGUID string, dockerImageCredentials v7action.DockerImageCredentials) (resources.Package, v7action.Warnings, error) CreateDockerPackageByApplicationNameAndSpace(appName string, spaceGUID string, dockerImageCredentials v7action.DockerImageCredentials) (resources.Package, v7action.Warnings, error) CreateIsolationSegmentByName(isolationSegment resources.IsolationSegment) (v7action.Warnings, error) @@ -188,7 +188,7 @@ type Actor interface { PollBuild(buildGUID string, appName string) (resources.Droplet, v7action.Warnings, error) PollPackage(pkg resources.Package) (resources.Package, v7action.Warnings, error) PollStart(app resources.Application, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) - PollStartForRolling(app resources.Application, deploymentGUID string, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) + PollStartForDeployment(app resources.Application, deploymentGUID string, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) PollTask(task resources.Task) (resources.Task, v7action.Warnings, error) PollUploadBuildpackJob(jobURL ccv3.JobURL) (v7action.Warnings, error) PrepareBuildpackBits(inputPath string, tmpDirPath string, downloader v7action.Downloader) (string, error) diff --git a/command/v7/continue_deployment_command.go b/command/v7/continue_deployment_command.go new file mode 100644 index 00000000000..cfd5530080e --- /dev/null +++ b/command/v7/continue_deployment_command.go @@ -0,0 +1,79 @@ +package v7 + +import ( + "code.cloudfoundry.org/cli/command/flag" + "code.cloudfoundry.org/cli/command/v7/shared" +) + +type ContinueDeploymentCommand struct { + BaseCommand + + RequiredArgs flag.AppName `positional-args:"yes"` + usage interface{} `usage:"CF_NAME continue-deployment APP_NAME\n\nEXAMPLES:\n cf continue-deployment my-app"` + relatedCommands interface{} `related_commands:"app, push"` +} + +func (cmd *ContinueDeploymentCommand) Execute(args []string) error { + err := cmd.SharedActor.CheckTarget(true, true) + if err != nil { + return err + } + + user, err := cmd.Actor.GetCurrentUser() + if err != nil { + return err + } + + cmd.UI.DisplayTextWithFlavor( + "Continuing deployment for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.UserName}}...\n", + map[string]interface{}{ + "AppName": cmd.RequiredArgs.AppName, + "OrgName": cmd.Config.TargetedOrganization().Name, + "SpaceName": cmd.Config.TargetedSpace().Name, + "UserName": user.Name, + }, + ) + + application, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) + cmd.UI.DisplayWarnings(warnings) + if err != nil { + return err + } + + deployment, warnings, err := cmd.Actor.GetLatestActiveDeploymentForApp(application.GUID) + cmd.UI.DisplayWarnings(warnings) + if err != nil { + return err + } + + warnings, err = cmd.Actor.ContinueDeployment(deployment.GUID) + cmd.UI.DisplayWarnings(warnings) + if err != nil { + return err + } + + cmd.UI.DisplayText("Waiting for app to deploy...\n") + + handleInstanceDetails := func(instanceDetails string) { + cmd.UI.DisplayText(instanceDetails) + } + + warnings, err = cmd.Actor.PollStartForDeployment(application, deployment.GUID, false, handleInstanceDetails) + cmd.UI.DisplayNewline() + cmd.UI.DisplayWarnings(warnings) + if err != nil { + return err + } + + summary, warnings, err := cmd.Actor.GetDetailedAppSummary(application.Name, application.SpaceGUID, false) + cmd.UI.DisplayWarnings(warnings) + if err != nil { + return err + } + + appSummaryDisplayer := shared.NewAppSummaryDisplayer(cmd.UI) + appSummaryDisplayer.AppDisplay(summary, false) + + cmd.UI.DisplayText("\nTIP: Run 'cf app {{.AppName}}' to view app status.", map[string]interface{}{"AppName": cmd.RequiredArgs.AppName}) + return nil +} diff --git a/command/v7/continue_deployment_command_test.go b/command/v7/continue_deployment_command_test.go new file mode 100644 index 00000000000..a5086c5c9bb --- /dev/null +++ b/command/v7/continue_deployment_command_test.go @@ -0,0 +1,244 @@ +package v7_test + +import ( + "errors" + + "code.cloudfoundry.org/cli/actor/actionerror" + "code.cloudfoundry.org/cli/actor/v7action" + "code.cloudfoundry.org/cli/command/commandfakes" + "code.cloudfoundry.org/cli/command/flag" + . "code.cloudfoundry.org/cli/command/v7" + "code.cloudfoundry.org/cli/command/v7/v7fakes" + "code.cloudfoundry.org/cli/resources" + "code.cloudfoundry.org/cli/util/configv3" + "code.cloudfoundry.org/cli/util/ui" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/onsi/gomega/gbytes" +) + +var _ = Describe("Continue deployment command", func() { + var ( + cmd ContinueDeploymentCommand + testUI *ui.UI + input *Buffer + fakeConfig *commandfakes.FakeConfig + fakeSharedActor *commandfakes.FakeSharedActor + fakeActor *v7fakes.FakeActor + binaryName string + appName string + spaceGUID string + executeErr error + ) + + BeforeEach(func() { + input = NewBuffer() + testUI = ui.NewTestUI(input, NewBuffer(), NewBuffer()) + fakeConfig = new(commandfakes.FakeConfig) + fakeSharedActor = new(commandfakes.FakeSharedActor) + fakeActor = new(v7fakes.FakeActor) + + binaryName = "clodFoundry" + fakeConfig.BinaryNameReturns(binaryName) + + cmd = ContinueDeploymentCommand{ + RequiredArgs: flag.AppName{AppName: appName}, + BaseCommand: BaseCommand{ + UI: testUI, + Config: fakeConfig, + SharedActor: fakeSharedActor, + Actor: fakeActor, + }, + } + + fakeConfig.TargetedOrganizationReturns(configv3.Organization{ + Name: "some-org", + GUID: "some-org-guid", + }) + + spaceGUID = "some-space-guid" + fakeConfig.TargetedSpaceReturns(configv3.Space{ + Name: "some-space", + GUID: spaceGUID, + }) + + fakeActor.GetCurrentUserReturns(configv3.User{Name: "timmyD"}, nil) + }) + + JustBeforeEach(func() { + executeErr = cmd.Execute(nil) + }) + + When("checking target fails", func() { + BeforeEach(func() { + fakeSharedActor.CheckTargetReturns(actionerror.NoOrganizationTargetedError{BinaryName: binaryName}) + }) + + It("returns an error", func() { + Expect(executeErr).To(MatchError(actionerror.NoOrganizationTargetedError{BinaryName: binaryName})) + + Expect(fakeSharedActor.CheckTargetCallCount()).To(Equal(1)) + checkTargetedOrg, checkTargetedSpace := fakeSharedActor.CheckTargetArgsForCall(0) + Expect(checkTargetedOrg).To(BeTrue()) + Expect(checkTargetedSpace).To(BeTrue()) + }) + }) + + When("the user is not logged in", func() { + var expectedErr error + + BeforeEach(func() { + expectedErr = errors.New("some current user error") + fakeActor.GetCurrentUserReturns(configv3.User{}, expectedErr) + }) + + It("return an error", func() { + Expect(executeErr).To(Equal(expectedErr)) + }) + }) + + When("the user is logged in", func() { + It("delegates to actor.GetApplicationByNameAndSpace", func() { + Expect(fakeActor.GetApplicationByNameAndSpaceCallCount()).To(Equal(1)) + actualAppName, actualSpaceGUID := fakeActor.GetApplicationByNameAndSpaceArgsForCall(0) + Expect(actualAppName).To(Equal(appName)) + Expect(actualSpaceGUID).To(Equal(spaceGUID)) + }) + + When("getting the app fails", func() { + BeforeEach(func() { + fakeActor.GetApplicationByNameAndSpaceReturns( + resources.Application{}, + v7action.Warnings{"get-app-warning"}, + errors.New("get-app-error"), + ) + }) + + It("returns the errors and outputs warnings", func() { + Expect(executeErr).To(MatchError("get-app-error")) + Expect(testUI.Err).To(Say("get-app-warning")) + + Expect(fakeActor.GetLatestActiveDeploymentForAppCallCount()).To(Equal(0)) + Expect(fakeActor.ContinueDeploymentCallCount()).To(Equal(0)) + }) + }) + + When("getting the app succeeds", func() { + var appGUID string + BeforeEach(func() { + appGUID = "some-app-guid" + fakeActor.GetApplicationByNameAndSpaceReturns( + resources.Application{Name: appName, GUID: appGUID}, + v7action.Warnings{"get-app-warning"}, + nil, + ) + }) + + It("delegates to actor.GetLatestDeployment", func() { + Expect(fakeActor.GetLatestActiveDeploymentForAppCallCount()).To(Equal(1)) + Expect(fakeActor.GetLatestActiveDeploymentForAppArgsForCall(0)).To(Equal(appGUID)) + }) + + When("getting the latest deployment fails", func() { + BeforeEach(func() { + fakeActor.GetLatestActiveDeploymentForAppReturns( + resources.Deployment{}, + v7action.Warnings{"get-deployment-warning"}, + errors.New("get-deployment-error"), + ) + }) + + It("returns the error and all warnings", func() { + Expect(executeErr).To(MatchError("get-deployment-error")) + Expect(testUI.Err).To(Say("get-app-warning")) + Expect(testUI.Err).To(Say("get-deployment-warning")) + + Expect(fakeActor.ContinueDeploymentCallCount()).To(Equal(0)) + }) + }) + + When("getting the latest deployment succeeds", func() { + var deploymentGUID string + BeforeEach(func() { + deploymentGUID = "some-deployment-guid" + fakeActor.GetLatestActiveDeploymentForAppReturns( + resources.Deployment{GUID: deploymentGUID}, + v7action.Warnings{"get-deployment-warning"}, + nil, + ) + }) + + It("delegates to actor.ContinueDeployment", func() { + Expect(fakeActor.ContinueDeploymentCallCount()).To(Equal(1)) + Expect(fakeActor.ContinueDeploymentArgsForCall(0)).To(Equal(deploymentGUID)) + }) + + When("continuing the deployment fails", func() { + BeforeEach(func() { + fakeActor.ContinueDeploymentReturns( + v7action.Warnings{"continue-deployment-warning"}, + errors.New("continue-deployment-error"), + ) + }) + + It("returns all warnings and errors", func() { + Expect(executeErr).To(MatchError("continue-deployment-error")) + Expect(testUI.Err).To(Say("get-app-warning")) + Expect(testUI.Err).To(Say("get-deployment-warning")) + Expect(testUI.Err).To(Say("continue-deployment-warning")) + }) + }) + + When("continuing the deployment succeeds", func() { + BeforeEach(func() { + fakeActor.ContinueDeploymentReturns( + nil, + nil, + ) + }) + + It("returns success", func() { + Expect(executeErr).ToNot(HaveOccurred()) + }) + + When("polling the application fails", func() { + BeforeEach(func() { + fakeActor.PollStartForDeploymentReturns( + v7action.Warnings{"poll-app-warning"}, errors.New("poll-app-error")) + }) + + It("returns an error", func() { + Expect(executeErr).To(MatchError("poll-app-error")) + }) + }) + + When("polling the application succeeds", func() { + BeforeEach(func() { + fakeActor.PollStartForDeploymentReturns(nil, nil) + }) + + When("getting the app summary fails", func() { + var expectedErr error + + BeforeEach(func() { + expectedErr = actionerror.ApplicationNotFoundError{Name: appName} + fakeActor.GetDetailedAppSummaryReturns(v7action.DetailedApplicationSummary{}, v7action.Warnings{"application-summary-warning-1", "application-summary-warning-2"}, expectedErr) + }) + + It("displays all warnings and returns an error", func() { + Expect(executeErr).To(Equal(actionerror.ApplicationNotFoundError{Name: appName})) + }) + }) + + When("getting the app summary succeeds", func() { + It("succeeds", func() { + Expect(executeErr).To(Not(HaveOccurred())) + }) + }) + }) + }) + }) + }) + }) +}) diff --git a/command/v7/copy_source_command.go b/command/v7/copy_source_command.go index a5c74ae0ea4..9d18a329d83 100644 --- a/command/v7/copy_source_command.go +++ b/command/v7/copy_source_command.go @@ -16,7 +16,7 @@ type CopySourceCommand struct { RequiredArgs flag.CopySourceArgs `positional-args:"yes"` usage interface{} `usage:"CF_NAME copy-source SOURCE_APP DESTINATION_APP [-s TARGET_SPACE [-o TARGET_ORG]] [--no-restart] [--strategy STRATEGY] [--no-wait]"` - Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy, either rolling or null"` + Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy can be canary, rolling or null"` NoWait bool `long:"no-wait" description:"Exit when the first instance of the web process is healthy"` NoRestart bool `long:"no-restart" description:"Do not restage the destination application"` Organization string `short:"o" long:"organization" description:"Org that contains the destination application"` @@ -159,15 +159,12 @@ func (cmd CopySourceCommand) Execute(args []string) error { ) cmd.UI.DisplayNewline() - err = cmd.Stager.StageAndStart( - targetApp, - targetSpace, - targetOrg, - pkg.GUID, - cmd.Strategy.Name, - cmd.NoWait, - constant.ApplicationRestarting, - ) + opts := shared.AppStartOpts{ + Strategy: cmd.Strategy.Name, + NoWait: cmd.NoWait, + AppAction: constant.ApplicationRestarting, + } + err = cmd.Stager.StageAndStart(targetApp, targetSpace, targetOrg, pkg.GUID, opts) if err != nil { return mapErr(cmd.Config, targetApp.Name, err) } diff --git a/command/v7/copy_source_command_test.go b/command/v7/copy_source_command_test.go index 17388c3f18b..2afadbdb1b0 100644 --- a/command/v7/copy_source_command_test.go +++ b/command/v7/copy_source_command_test.go @@ -333,14 +333,34 @@ var _ = Describe("copy-source Command", func() { It("stages and starts the app with the appropriate strategy", func() { Expect(fakeAppStager.StageAndStartCallCount()).To(Equal(1)) - returnedApp, spaceForApp, orgForApp, pkgGUID, strategy, noWait, appAction := fakeAppStager.StageAndStartArgsForCall(0) + returnedApp, spaceForApp, orgForApp, pkgGUID, opts := fakeAppStager.StageAndStartArgsForCall(0) Expect(returnedApp).To(Equal(targetApp)) Expect(spaceForApp).To(Equal(configv3.Space{Name: "some-space", GUID: "some-space-guid"})) Expect(orgForApp).To(Equal(configv3.Organization{Name: "some-org"})) Expect(pkgGUID).To(Equal("target-package-guid")) - Expect(strategy).To(Equal(constant.DeploymentStrategyRolling)) - Expect(noWait).To(Equal(false)) - Expect(appAction).To(Equal(constant.ApplicationRestarting)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyRolling)) + Expect(opts.NoWait).To(Equal(false)) + Expect(opts.AppAction).To(Equal(constant.ApplicationRestarting)) + }) + }) + + When("the strategy flag is set to canary", func() { + BeforeEach(func() { + cmd.Strategy = flag.DeploymentStrategy{ + Name: constant.DeploymentStrategyCanary, + } + }) + + It("stages and starts the app with the appropriate strategy", func() { + Expect(fakeAppStager.StageAndStartCallCount()).To(Equal(1)) + returnedApp, spaceForApp, orgForApp, pkgGUID, opts := fakeAppStager.StageAndStartArgsForCall(0) + Expect(returnedApp).To(Equal(targetApp)) + Expect(spaceForApp).To(Equal(configv3.Space{Name: "some-space", GUID: "some-space-guid"})) + Expect(orgForApp).To(Equal(configv3.Organization{Name: "some-org"})) + Expect(pkgGUID).To(Equal("target-package-guid")) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyCanary)) + Expect(opts.NoWait).To(Equal(false)) + Expect(opts.AppAction).To(Equal(constant.ApplicationRestarting)) }) }) @@ -351,27 +371,27 @@ var _ = Describe("copy-source Command", func() { It("stages and starts the app with the appropriate strategy", func() { Expect(fakeAppStager.StageAndStartCallCount()).To(Equal(1)) - returnedApp, spaceForApp, orgForApp, pkgGUID, strategy, noWait, appAction := fakeAppStager.StageAndStartArgsForCall(0) + returnedApp, spaceForApp, orgForApp, pkgGUID, opts := fakeAppStager.StageAndStartArgsForCall(0) Expect(returnedApp).To(Equal(targetApp)) Expect(spaceForApp).To(Equal(configv3.Space{Name: "some-space", GUID: "some-space-guid"})) Expect(orgForApp).To(Equal(configv3.Organization{Name: "some-org"})) Expect(pkgGUID).To(Equal("target-package-guid")) - Expect(strategy).To(Equal(constant.DeploymentStrategyDefault)) - Expect(noWait).To(Equal(true)) - Expect(appAction).To(Equal(constant.ApplicationRestarting)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyDefault)) + Expect(opts.NoWait).To(Equal(true)) + Expect(opts.AppAction).To(Equal(constant.ApplicationRestarting)) }) }) It("stages and starts the target app", func() { Expect(fakeAppStager.StageAndStartCallCount()).To(Equal(1)) - returnedApp, spaceForApp, orgForApp, pkgGUID, strategy, noWait, appAction := fakeAppStager.StageAndStartArgsForCall(0) + returnedApp, spaceForApp, orgForApp, pkgGUID, opts := fakeAppStager.StageAndStartArgsForCall(0) Expect(returnedApp).To(Equal(targetApp)) Expect(spaceForApp).To(Equal(configv3.Space{Name: "some-space", GUID: "some-space-guid"})) Expect(orgForApp).To(Equal(configv3.Organization{Name: "some-org"})) Expect(pkgGUID).To(Equal("target-package-guid")) - Expect(strategy).To(Equal(constant.DeploymentStrategyDefault)) - Expect(noWait).To(Equal(false)) - Expect(appAction).To(Equal(constant.ApplicationRestarting)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyDefault)) + Expect(opts.NoWait).To(Equal(false)) + Expect(opts.AppAction).To(Equal(constant.ApplicationRestarting)) }) When("staging and starting the app fails", func() { diff --git a/command/v7/push_command.go b/command/v7/push_command.go index 675d5b26e14..12e0001b15e 100644 --- a/command/v7/push_command.go +++ b/command/v7/push_command.go @@ -100,7 +100,7 @@ type PushCommand struct { RedactEnv bool `long:"redact-env" description:"Do not print values for environment vars set in the application manifest"` Stack string `long:"stack" short:"s" description:"Stack to use (a stack is a pre-built file system, including an operating system, that can run apps)"` StartCommand flag.Command `long:"start-command" short:"c" description:"Startup command, set to null to reset to default start command"` - Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy, either rolling or null."` + Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy can be canary, rolling or null."` Task bool `long:"task" description:"Push an app that is used only to execute tasks. The app will be staged, but not started and will have no route assigned."` Vars []template.VarKV `long:"var" description:"Variable key value pair for variable substitution, (e.g., name=app1); can specify multiple times"` PathsToVarsFiles []flag.PathWithExistenceCheck `long:"vars-file" description:"Path to a variable substitution file for manifest; can specify multiple times"` @@ -452,6 +452,22 @@ func (cmd PushCommand) ValidateFlags() error { }, } + case cmd.NoStart && cmd.Strategy == flag.DeploymentStrategy{Name: constant.DeploymentStrategyCanary}: + return translatableerror.ArgumentCombinationError{ + Args: []string{ + "--no-start", + "--strategy=canary", + }, + } + + case cmd.Task && cmd.Strategy == flag.DeploymentStrategy{Name: constant.DeploymentStrategyCanary}: + return translatableerror.ArgumentCombinationError{ + Args: []string{ + "--task", + "--strategy=canary", + }, + } + case cmd.NoStart && cmd.NoWait: return translatableerror.ArgumentCombinationError{ Args: []string{ diff --git a/command/v7/push_command_test.go b/command/v7/push_command_test.go index 9bd3c070ab1..00a464644cc 100644 --- a/command/v7/push_command_test.go +++ b/command/v7/push_command_test.go @@ -1218,6 +1218,17 @@ var _ = Describe("push Command", func() { }, }), + Entry("when strategy 'canary' and no-start flags are passed", + func() { + cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyCanary} + cmd.NoStart = true + }, + translatableerror.ArgumentCombinationError{ + Args: []string{ + "--no-start", "--strategy=canary", + }, + }), + Entry("when strategy is not set and no-start flags are passed", func() { cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyDefault} @@ -1258,7 +1269,7 @@ var _ = Describe("push Command", func() { }, translatableerror.InvalidBuildpacksError{}), - Entry("task and strategy flags are passed", + Entry("task and 'rolling' strategy flags are passed", func() { cmd.Task = true cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyRolling} @@ -1268,5 +1279,16 @@ var _ = Describe("push Command", func() { "--task", "--strategy=rolling", }, }), + + Entry("task and 'canary' strategy flags are passed", + func() { + cmd.Task = true + cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyCanary} + }, + translatableerror.ArgumentCombinationError{ + Args: []string{ + "--task", "--strategy=canary", + }, + }), ) }) diff --git a/command/v7/restage_command.go b/command/v7/restage_command.go index e9dc01ced53..76b02c618bd 100644 --- a/command/v7/restage_command.go +++ b/command/v7/restage_command.go @@ -15,9 +15,9 @@ type RestageCommand struct { BaseCommand RequiredArgs flag.AppName `positional-args:"yes"` - Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy, either rolling or null."` + Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy can be canary, rolling or null."` NoWait bool `long:"no-wait" description:"Exit when the first instance of the web process is healthy"` - usage interface{} `usage:"CF_NAME restage APP_NAME\n\n This command will cause downtime unless you use '--strategy rolling'.\n\nEXAMPLES:\n CF_NAME restage APP_NAME\n CF_NAME restage APP_NAME --strategy rolling\n CF_NAME restage APP_NAME --strategy rolling --no-wait"` + usage interface{} `usage:"CF_NAME restage APP_NAME\n\n This command will cause downtime unless you use '--strategy' flag.\n\nEXAMPLES:\n CF_NAME restage APP_NAME\n CF_NAME restage APP_NAME --strategy rolling\n CF_NAME restage APP_NAME --strategy canary --no-wait"` relatedCommands interface{} `related_commands:"restart"` envCFStagingTimeout interface{} `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for staging, in minutes" environmentDefault:"15"` envCFStartupTimeout interface{} `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"` @@ -52,7 +52,7 @@ func (cmd RestageCommand) Execute(args []string) error { return err } - if cmd.Strategy.Name != constant.DeploymentStrategyRolling { + if len(cmd.Strategy.Name) <= 0 { cmd.UI.DisplayWarning("This action will cause app downtime.") } @@ -77,15 +77,12 @@ func (cmd RestageCommand) Execute(args []string) error { return mapErr(cmd.Config, cmd.RequiredArgs.AppName, err) } - err = cmd.Stager.StageAndStart( - app, - cmd.Config.TargetedSpace(), - cmd.Config.TargetedOrganization(), - pkg.GUID, - cmd.Strategy.Name, - cmd.NoWait, - constant.ApplicationRestarting, - ) + opts := shared.AppStartOpts{ + Strategy: cmd.Strategy.Name, + NoWait: cmd.NoWait, + AppAction: constant.ApplicationRestarting, + } + err = cmd.Stager.StageAndStart(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), pkg.GUID, opts) if err != nil { return mapErr(cmd.Config, cmd.RequiredArgs.AppName, err) } diff --git a/command/v7/restage_command_test.go b/command/v7/restage_command_test.go index 741a2f108da..652e7740d84 100644 --- a/command/v7/restage_command_test.go +++ b/command/v7/restage_command_test.go @@ -105,7 +105,7 @@ var _ = Describe("restage Command", func() { }) }) - When("it's NOT a rolling deploy", func() { + When("No strategy flag is given", func() { BeforeEach(func() { cmd.Strategy.Name = constant.DeploymentStrategyDefault }) @@ -165,14 +165,14 @@ var _ = Describe("restage Command", func() { It("stages and starts the app", func() { Expect(fakeAppStager.StageAndStartCallCount()).To(Equal(1)) - returnedApp, spaceForApp, orgForApp, pkgGUID, strategy, noWait, appAction := fakeAppStager.StageAndStartArgsForCall(0) + returnedApp, spaceForApp, orgForApp, pkgGUID, opts := fakeAppStager.StageAndStartArgsForCall(0) Expect(returnedApp).To(Equal(app)) Expect(spaceForApp).To(Equal(fakeConfig.TargetedSpace())) Expect(orgForApp).To(Equal(fakeConfig.TargetedOrganization())) Expect(pkgGUID).To(Equal("earliest-package-guid")) - Expect(strategy).To(Equal(constant.DeploymentStrategyDefault)) - Expect(noWait).To(Equal(false)) - Expect(appAction).To(Equal(constant.ApplicationRestarting)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyDefault)) + Expect(opts.NoWait).To(Equal(false)) + Expect(opts.AppAction).To(Equal(constant.ApplicationRestarting)) }) When("staging and starting the app fails", func() { diff --git a/command/v7/restart_command.go b/command/v7/restart_command.go index 71b7774e796..1a453d50b9e 100644 --- a/command/v7/restart_command.go +++ b/command/v7/restart_command.go @@ -13,9 +13,9 @@ type RestartCommand struct { BaseCommand RequiredArgs flag.AppName `positional-args:"yes"` - Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy, either rolling or null."` + Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy can be canary, rolling or null."` NoWait bool `long:"no-wait" description:"Exit when the first instance of the web process is healthy"` - usage interface{} `usage:"CF_NAME restart APP_NAME\n\n This command will cause downtime unless you use '--strategy rolling'.\n\n If the app's most recent package is unstaged, restarting the app will stage and run that package.\n Otherwise, the app's current droplet will be run."` + usage interface{} `usage:"CF_NAME restart APP_NAME\n\n This command will cause downtime unless you use '--strategy canary' or '--strategy rolling'.\n\n If the app's most recent package is unstaged, restarting the app will stage and run that package.\n Otherwise, the app's current droplet will be run."` relatedCommands interface{} `related_commands:"restage, restart-app-instance"` envCFStagingTimeout interface{} `environmentName:"CF_STAGING_TIMEOUT" environmentDescription:"Max wait time for staging, in minutes" environmentDefault:"15"` envCFStartupTimeout interface{} `environmentName:"CF_STARTUP_TIMEOUT" environmentDescription:"Max wait time for app instance startup, in minutes" environmentDefault:"5"` @@ -62,7 +62,7 @@ func (cmd RestartCommand) Execute(args []string) error { return err } - if packageGUID != "" || cmd.Strategy.Name == constant.DeploymentStrategyRolling { + if packageGUID != "" || len(cmd.Strategy.Name) > 0 { cmd.UI.DisplayTextWithFlavor("Restarting app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{ "AppName": cmd.RequiredArgs.AppName, "OrgName": cmd.Config.TargetedOrganization().Name, @@ -72,13 +72,18 @@ func (cmd RestartCommand) Execute(args []string) error { cmd.UI.DisplayNewline() } + opts := shared.AppStartOpts{ + Strategy: cmd.Strategy.Name, + NoWait: cmd.NoWait, + AppAction: constant.ApplicationRestarting, + } if packageGUID != "" { - err = cmd.Stager.StageAndStart(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), packageGUID, cmd.Strategy.Name, cmd.NoWait, constant.ApplicationRestarting) + err = cmd.Stager.StageAndStart(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), packageGUID, opts) if err != nil { return err } } else { - err = cmd.Stager.StartApp(app, "", cmd.Strategy.Name, cmd.NoWait, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), constant.ApplicationRestarting) + err = cmd.Stager.StartApp(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), "", opts) if err != nil { return err } diff --git a/command/v7/restart_command_test.go b/command/v7/restart_command_test.go index a339fa05cf1..2cea1f43b97 100644 --- a/command/v7/restart_command_test.go +++ b/command/v7/restart_command_test.go @@ -136,14 +136,14 @@ var _ = Describe("restart Command", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(fakeAppStager.StageAndStartCallCount()).To(Equal(1)) - inputApp, inputSpace, inputOrg, inputPkgGUID, inputStrategy, inputNoWait, inputAppAction := fakeAppStager.StageAndStartArgsForCall(0) + inputApp, inputSpace, inputOrg, inputPkgGUID, opts := fakeAppStager.StageAndStartArgsForCall(0) Expect(inputApp).To(Equal(app)) Expect(inputSpace).To(Equal(cmd.Config.TargetedSpace())) Expect(inputOrg).To(Equal(cmd.Config.TargetedOrganization())) Expect(inputPkgGUID).To(Equal("package-guid")) - Expect(inputStrategy).To(Equal(strategy)) - Expect(inputNoWait).To(Equal(noWait)) - Expect(inputAppAction).To(Equal(constant.ApplicationRestarting)) + Expect(opts.Strategy).To(Equal(strategy)) + Expect(opts.NoWait).To(Equal(noWait)) + Expect(opts.AppAction).To(Equal(constant.ApplicationRestarting)) }) Context("staging and starting the app returns an error", func() { @@ -166,14 +166,14 @@ var _ = Describe("restart Command", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(fakeAppStager.StartAppCallCount()).To(Equal(1)) - inputApp, inputDropletGuid, inputStrategy, inputNoWait, inputSpace, inputOrg, inputAppAction := fakeAppStager.StartAppArgsForCall(0) + inputApp, inputSpace, inputOrg, inputDropletGuid, opts := fakeAppStager.StartAppArgsForCall(0) Expect(inputApp).To(Equal(app)) Expect(inputDropletGuid).To(Equal("")) - Expect(inputStrategy).To(Equal(strategy)) - Expect(inputNoWait).To(Equal(noWait)) Expect(inputSpace).To(Equal(cmd.Config.TargetedSpace())) Expect(inputOrg).To(Equal(cmd.Config.TargetedOrganization())) - Expect(inputAppAction).To(Equal(constant.ApplicationRestarting)) + Expect(opts.Strategy).To(Equal(strategy)) + Expect(opts.NoWait).To(Equal(noWait)) + Expect(opts.AppAction).To(Equal(constant.ApplicationRestarting)) }) When("starting the app returns an error", func() { diff --git a/command/v7/revisions_command.go b/command/v7/revisions_command.go index c6c484fff5b..d2b1b87b9b8 100644 --- a/command/v7/revisions_command.go +++ b/command/v7/revisions_command.go @@ -113,7 +113,7 @@ func (cmd RevisionsCommand) Execute(_ []string) error { } if len(revisionsDeployed) > 1 { - cmd.UI.DisplayText("Info: this app is in the middle of a rolling deployment. More than one revision is deployed.") + cmd.UI.DisplayText("Info: this app is in the middle of a deployment. More than one revision is deployed.") cmd.UI.DisplayNewline() } diff --git a/command/v7/revisions_command_test.go b/command/v7/revisions_command_test.go index 669896448b8..e7a7987ea46 100644 --- a/command/v7/revisions_command_test.go +++ b/command/v7/revisions_command_test.go @@ -166,7 +166,7 @@ var _ = Describe("revisions Command", func() { }) It("does not display an informative message", func() { - Expect(testUI.Out).NotTo(Say("Info: this app is in the middle of a rolling deployment. More than one revision is deployed.")) + Expect(testUI.Out).NotTo(Say("Info: this app is in the middle of a deployment. More than one revision is deployed.")) }) When("there is more than one revision deployed", func() { @@ -195,7 +195,7 @@ var _ = Describe("revisions Command", func() { Expect(testUI.Out).To(Say("2\\(deployed\\) Something else true A89F8259-D32B-491A-ABD6-F100AC42D74C 2020-03-08T12:43:30Z")) }) It("displays an informative message", func() { - Expect(testUI.Out).To(Say("Info: this app is in the middle of a rolling deployment. More than one revision is deployed.")) + Expect(testUI.Out).To(Say("Info: this app is in the middle of a deployment. More than one revision is deployed.")) }) }) diff --git a/command/v7/rollback_command.go b/command/v7/rollback_command.go index 8c3e0f005ca..f01205837f6 100644 --- a/command/v7/rollback_command.go +++ b/command/v7/rollback_command.go @@ -106,15 +106,13 @@ func (cmd RollbackCommand) Execute(args []string) error { "Username": user.Name, }) - startAppErr := cmd.Stager.StartApp( - app, - revision.GUID, - constant.DeploymentStrategyRolling, - false, - cmd.Config.TargetedSpace(), - cmd.Config.TargetedOrganization(), - constant.ApplicationRollingBack, - ) + opts := shared.AppStartOpts{ + Strategy: constant.DeploymentStrategyRolling, + NoWait: false, + AppAction: constant.ApplicationRollingBack, + } + + startAppErr := cmd.Stager.StartApp(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), revision.GUID, opts) if startAppErr != nil { return startAppErr } diff --git a/command/v7/rollback_command_test.go b/command/v7/rollback_command_test.go index e5ce2ac4925..59f1a6bec36 100644 --- a/command/v7/rollback_command_test.go +++ b/command/v7/rollback_command_test.go @@ -188,10 +188,10 @@ var _ = Describe("rollback Command", func() { It("skips the prompt and executes the rollback", func() { Expect(fakeAppStager.StartAppCallCount()).To(Equal(1), "GetStartApp call count") - application, revisionGUID, _, _, _, _, appAction := fakeAppStager.StartAppArgsForCall(0) + application, _, _, revisionGUID, opts := fakeAppStager.StartAppArgsForCall(0) Expect(application.GUID).To(Equal("123")) Expect(revisionGUID).To(Equal("some-1-guid")) - Expect(appAction).To(Equal(constant.ApplicationRollingBack)) + Expect(opts.AppAction).To(Equal(constant.ApplicationRollingBack)) Expect(testUI.Out).ToNot(Say("Rolling '%s' back to revision '1' will create a new revision. The new revision '3' will use the settings from revision '1'.", app)) Expect(testUI.Out).ToNot(Say("Are you sure you want to continue?")) @@ -215,10 +215,10 @@ var _ = Describe("rollback Command", func() { It("successfully executes the command and outputs warnings", func() { Expect(fakeAppStager.StartAppCallCount()).To(Equal(1), "GetStartApp call count") - application, revisionGUID, _, _, _, _, appAction := fakeAppStager.StartAppArgsForCall(0) + application, _, _, revisionGUID, opts := fakeAppStager.StartAppArgsForCall(0) Expect(application.GUID).To(Equal("123")) Expect(revisionGUID).To(Equal("some-1-guid")) - Expect(appAction).To(Equal(constant.ApplicationRollingBack)) + Expect(opts.AppAction).To(Equal(constant.ApplicationRollingBack)) Expect(testUI.Out).To(Say("Rolling '%s' back to revision '1' will create a new revision. The new revision will use the settings from revision '1'.", app)) Expect(testUI.Out).To(Say("Are you sure you want to continue?")) diff --git a/command/v7/shared/app_stager.go b/command/v7/shared/app_stager.go index 5399d6f5575..5364bbd31c2 100644 --- a/command/v7/shared/app_stager.go +++ b/command/v7/shared/app_stager.go @@ -21,31 +21,17 @@ import ( //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . AppStager type AppStager interface { - StageAndStart( - app resources.Application, - space configv3.Space, - organization configv3.Organization, - packageGUID string, - strategy constant.DeploymentStrategy, - noWait bool, - appAction constant.ApplicationAction, - ) error - - StageApp( - app resources.Application, - packageGUID string, - space configv3.Space, - ) (resources.Droplet, error) - - StartApp( - app resources.Application, - resourceGuid string, - strategy constant.DeploymentStrategy, - noWait bool, - space configv3.Space, - organization configv3.Organization, - appAction constant.ApplicationAction, - ) error + StageAndStart(app resources.Application, space configv3.Space, organization configv3.Organization, packageGUID string, opts AppStartOpts) error + + StageApp(app resources.Application, packageGUID string, space configv3.Space) (resources.Droplet, error) + + StartApp(app resources.Application, space configv3.Space, organization configv3.Organization, resourceGuid string, opts AppStartOpts) error +} + +type AppStartOpts struct { + Strategy constant.DeploymentStrategy + NoWait bool + AppAction constant.ApplicationAction } type Stager struct { @@ -56,13 +42,12 @@ type Stager struct { } type stagingAndStartActor interface { - CreateDeploymentByApplicationAndDroplet(appGUID string, dropletGUID string) (string, v7action.Warnings, error) - CreateDeploymentByApplicationAndRevision(appGUID string, revisionGUID string) (string, v7action.Warnings, error) + CreateDeployment(dep resources.Deployment) (string, v7action.Warnings, error) GetCurrentUser() (configv3.User, error) GetDetailedAppSummary(appName string, spaceGUID string, withObfuscatedValues bool) (v7action.DetailedApplicationSummary, v7action.Warnings, error) GetStreamingLogsForApplicationByNameAndSpace(appName string, spaceGUID string, client sharedaction.LogCacheClient) (<-chan sharedaction.LogMessage, <-chan error, context.CancelFunc, v7action.Warnings, error) PollStart(app resources.Application, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) - PollStartForRolling(app resources.Application, deploymentGUID string, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) + PollStartForDeployment(app resources.Application, deploymentGUID string, noWait bool, handleProcessStats func(string)) (v7action.Warnings, error) SetApplicationDroplet(appGUID string, dropletGUID string) (v7action.Warnings, error) StagePackage(packageGUID, appName, spaceGUID string) (<-chan resources.Droplet, <-chan v7action.Warnings, <-chan error) StartApplication(appGUID string) (v7action.Warnings, error) @@ -78,15 +63,7 @@ func NewAppStager(actor stagingAndStartActor, ui command.UI, config command.Conf } } -func (stager *Stager) StageAndStart( - app resources.Application, - space configv3.Space, - organization configv3.Organization, - packageGUID string, - strategy constant.DeploymentStrategy, - noWait bool, - appAction constant.ApplicationAction, -) error { +func (stager *Stager) StageAndStart(app resources.Application, space configv3.Space, organization configv3.Organization, packageGUID string, opts AppStartOpts) error { droplet, err := stager.StageApp(app, packageGUID, space) if err != nil { @@ -95,7 +72,7 @@ func (stager *Stager) StageAndStart( stager.UI.DisplayNewline() - err = stager.StartApp(app, droplet.GUID, strategy, noWait, space, organization, appAction) + err = stager.StartApp(app, space, organization, droplet.GUID, opts) if err != nil { return err } @@ -126,16 +103,8 @@ func (stager *Stager) StageApp(app resources.Application, packageGUID string, sp return droplet, nil } -func (stager *Stager) StartApp( - app resources.Application, - resourceGuid string, - strategy constant.DeploymentStrategy, - noWait bool, - space configv3.Space, - organization configv3.Organization, - appAction constant.ApplicationAction, -) error { - if strategy == constant.DeploymentStrategyRolling { +func (stager *Stager) StartApp(app resources.Application, space configv3.Space, organization configv3.Organization, resourceGuid string, opts AppStartOpts) error { + if len(opts.Strategy) > 0 { stager.UI.DisplayText("Creating deployment for app {{.AppName}}...\n", map[string]interface{}{ "AppName": app.Name, @@ -148,11 +117,17 @@ func (stager *Stager) StartApp( err error ) - switch appAction { + dep := resources.Deployment{ + Strategy: opts.Strategy, + Relationships: resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: app.GUID}}, + } + switch opts.AppAction { case constant.ApplicationRollingBack: - deploymentGUID, warnings, err = stager.Actor.CreateDeploymentByApplicationAndRevision(app.GUID, resourceGuid) + dep.RevisionGUID = resourceGuid + deploymentGUID, warnings, err = stager.Actor.CreateDeployment(dep) default: - deploymentGUID, warnings, err = stager.Actor.CreateDeploymentByApplicationAndDroplet(app.GUID, resourceGuid) + dep.DropletGUID = resourceGuid + deploymentGUID, warnings, err = stager.Actor.CreateDeployment(dep) } stager.UI.DisplayWarnings(warnings) @@ -166,13 +141,14 @@ func (stager *Stager) StartApp( stager.UI.DisplayText(instanceDetails) } - warnings, err = stager.Actor.PollStartForRolling(app, deploymentGUID, noWait, handleInstanceDetails) + warnings, err = stager.Actor.PollStartForDeployment(app, deploymentGUID, opts.NoWait, handleInstanceDetails) stager.UI.DisplayNewline() stager.UI.DisplayWarnings(warnings) if err != nil { return err } - if noWait == true { + + if opts.NoWait && opts.Strategy != constant.DeploymentStrategyCanary { stager.UI.DisplayText("First instance restaged correctly, restaging remaining in the background") return nil } @@ -182,7 +158,7 @@ func (stager *Stager) StartApp( return err } - flavorText := fmt.Sprintf("%s app {{.App}} in org {{.Org}} / space {{.Space}} as {{.UserName}}...", appAction) + flavorText := fmt.Sprintf("%s app {{.App}} in org {{.Org}} / space {{.Space}} as {{.UserName}}...", opts.AppAction) stager.UI.DisplayTextWithFlavor(flavorText, map[string]interface{}{ "App": app.Name, @@ -194,7 +170,7 @@ func (stager *Stager) StartApp( stager.UI.DisplayNewline() if app.Started() { - if appAction == constant.ApplicationStarting { + if opts.AppAction == constant.ApplicationStarting { stager.UI.DisplayText("App '{{.AppName}}' is already started.", map[string]interface{}{ "AppName": app.Name, @@ -237,7 +213,7 @@ func (stager *Stager) StartApp( stager.UI.DisplayText(instanceDetails) } - warnings, err = stager.Actor.PollStart(app, noWait, handleInstanceDetails) + warnings, err = stager.Actor.PollStart(app, opts.NoWait, handleInstanceDetails) stager.UI.DisplayNewline() stager.UI.DisplayWarnings(warnings) if err != nil { diff --git a/command/v7/shared/app_stager_test.go b/command/v7/shared/app_stager_test.go index de22a805a23..9c6b936ea59 100644 --- a/command/v7/shared/app_stager_test.go +++ b/command/v7/shared/app_stager_test.go @@ -106,15 +106,12 @@ var _ = Describe("app stager", func() { JustBeforeEach(func() { appStager = shared.NewAppStager(fakeActor, testUI, fakeConfig, fakeLogCacheClient) - executeErr = appStager.StageAndStart( - app, - space, - organization, - pkgGUID, - strategy, - noWait, - appAction, - ) + opts := shared.AppStartOpts{ + Strategy: strategy, + NoWait: noWait, + AppAction: appAction, + } + executeErr = appStager.StageAndStart(app, space, organization, pkgGUID, opts) }) It("stages and starts the app", func() { @@ -177,15 +174,12 @@ var _ = Describe("app stager", func() { strategy = constant.DeploymentStrategyRolling noWait = true appStager = shared.NewAppStager(fakeActor, testUI, fakeConfig, fakeLogCacheClient) - executeErr = appStager.StageAndStart( - app, - space, - organization, - pkgGUID, - strategy, - noWait, - appAction, - ) + opts := shared.AppStartOpts{ + Strategy: strategy, + NoWait: noWait, + AppAction: appAction, + } + executeErr = appStager.StageAndStart(app, space, organization, pkgGUID, opts) }) It("Restages and starts the app", func() { @@ -363,27 +357,24 @@ var _ = Describe("app stager", func() { JustBeforeEach(func() { appStager = shared.NewAppStager(fakeActor, testUI, fakeConfig, fakeLogCacheClient) - executeErr = appStager.StartApp( - app, - resourceGUID, - strategy, - noWait, - space, - organization, - appAction, - ) + opts := shared.AppStartOpts{ + Strategy: strategy, + NoWait: noWait, + AppAction: appAction, + } + executeErr = appStager.StartApp(app, space, organization, resourceGUID, opts) }) When("the deployment strategy is rolling", func() { BeforeEach(func() { strategy = constant.DeploymentStrategyRolling - fakeActor.CreateDeploymentByApplicationAndDropletReturns( + fakeActor.CreateDeploymentReturns( "some-deployment-guid", v7action.Warnings{"create-deployment-warning"}, nil, ) - fakeActor.PollStartForRollingReturns( + fakeActor.PollStartForDeploymentReturns( v7action.Warnings{"poll-start-warning"}, nil, ) @@ -393,7 +384,7 @@ var _ = Describe("app stager", func() { BeforeEach(func() { appAction = constant.ApplicationRollingBack resourceGUID = "revision-guid" - fakeActor.CreateDeploymentByApplicationAndRevisionReturns( + fakeActor.CreateDeploymentReturns( "some-deployment-guid", v7action.Warnings{"create-deployment-warning"}, nil, @@ -404,14 +395,14 @@ var _ = Describe("app stager", func() { Expect(executeErr).NotTo(HaveOccurred()) Expect(testUI.Out).To(Say("Creating deployment for app %s...", app.Name)) - Expect(fakeActor.CreateDeploymentByApplicationAndRevisionCallCount()).To(Equal(1), "CreateDeployment...") - appGUID, revisionGUID := fakeActor.CreateDeploymentByApplicationAndRevisionArgsForCall(0) - Expect(appGUID).To(Equal(app.GUID)) - Expect(revisionGUID).To(Equal("revision-guid")) + Expect(fakeActor.CreateDeploymentCallCount()).To(Equal(1), "CreateDeployment...") + dep := fakeActor.CreateDeploymentArgsForCall(0) + Expect(dep.Relationships[constant.RelationshipTypeApplication].GUID).To(Equal(app.GUID)) + Expect(dep.RevisionGUID).To(Equal("revision-guid")) Expect(testUI.Err).To(Say("create-deployment-warning")) Expect(testUI.Out).To(Say("Waiting for app to deploy...")) - Expect(fakeActor.PollStartForRollingCallCount()).To(Equal(1)) + Expect(fakeActor.PollStartForDeploymentCallCount()).To(Equal(1)) Expect(testUI.Err).To(Say("poll-start-warning")) }) }) @@ -421,21 +412,21 @@ var _ = Describe("app stager", func() { Expect(executeErr).To(BeNil()) Expect(testUI.Out).To(Say("Creating deployment for app %s...", app.Name)) - Expect(fakeActor.CreateDeploymentByApplicationAndDropletCallCount()).To(Equal(1)) - appGUID, dropletGUID := fakeActor.CreateDeploymentByApplicationAndDropletArgsForCall(0) - Expect(appGUID).To(Equal(app.GUID)) - Expect(dropletGUID).To(Equal("droplet-guid")) + Expect(fakeActor.CreateDeploymentCallCount()).To(Equal(1)) + dep := fakeActor.CreateDeploymentArgsForCall(0) + Expect(dep.Relationships[constant.RelationshipTypeApplication].GUID).To(Equal(app.GUID)) + Expect(dep.DropletGUID).To(Equal("droplet-guid")) Expect(testUI.Err).To(Say("create-deployment-warning")) Expect(testUI.Out).To(Say("Waiting for app to deploy...")) - Expect(fakeActor.PollStartForRollingCallCount()).To(Equal(1)) + Expect(fakeActor.PollStartForDeploymentCallCount()).To(Equal(1)) Expect(testUI.Err).To(Say("poll-start-warning")) }) }) When("creating a deployment fails", func() { BeforeEach(func() { - fakeActor.CreateDeploymentByApplicationAndDropletReturns( + fakeActor.CreateDeploymentReturns( "", v7action.Warnings{"create-deployment-warning"}, errors.New("create-deployment-error"), @@ -449,7 +440,7 @@ var _ = Describe("app stager", func() { When("polling fails for a rolling restage", func() { BeforeEach(func() { - fakeActor.PollStartForRollingReturns( + fakeActor.PollStartForDeploymentReturns( v7action.Warnings{"poll-start-warning"}, errors.New("poll-start-error"), ) diff --git a/command/v7/shared/app_summary_displayer.go b/command/v7/shared/app_summary_displayer.go index 097a924dd3e..c784e8f4194 100644 --- a/command/v7/shared/app_summary_displayer.go +++ b/command/v7/shared/app_summary_displayer.go @@ -178,9 +178,18 @@ func (display AppSummaryDisplayer) getDeploymentStatusText(summary v7action.Deta summary.Deployment.StatusReason, lastStatusChangeTime) } else { - return fmt.Sprintf("%s deployment currently %s", + var sb strings.Builder + sb.WriteString(fmt.Sprintf("%s deployment currently %s.", cases.Title(language.English, cases.NoLower).String(string(summary.Deployment.Strategy)), - summary.Deployment.StatusReason) + summary.Deployment.StatusReason)) + + if summary.Deployment.Strategy == constant.DeploymentStrategyCanary && summary.Deployment.StatusReason == constant.DeploymentStatusReasonPaused { + sb.WriteString("\n") + sb.WriteString(fmt.Sprintf( + "Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", + summary.Application.Name, summary.Application.Name)) + } + return sb.String() } } diff --git a/command/v7/shared/app_summary_displayer_test.go b/command/v7/shared/app_summary_displayer_test.go index 35d80703faa..b95ece0a046 100644 --- a/command/v7/shared/app_summary_displayer_test.go +++ b/command/v7/shared/app_summary_displayer_test.go @@ -732,7 +732,7 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING\n`)) + Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING`)) Expect(testUI.Out).NotTo(Say(`\(since`)) }) }) @@ -819,6 +819,45 @@ var _ = Describe("app summary displayer", func() { }) }) }) + When("the deployment strategy is canary", func() { + When("the deployment is paused", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + ApplicationSummary: v7action.ApplicationSummary{ + Application: resources.Application{ + Name: "some-app", + }, + }, + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonPaused, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say("Canary deployment currently PAUSED.")) + Expect(testUI.Out).To(Say("Please run `cf continue-deployment some-app` to promote the canary deployment, or `cf cancel-deployment some-app` to rollback to the previous version.")) + }) + }) + + When("the deployment is cancelled", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonCanceling, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say("Canary deployment currently CANCELING.")) + }) + }) + }) }) When("there is no active deployment", func() { diff --git a/command/v7/shared/sharedfakes/fake_app_stager.go b/command/v7/shared/sharedfakes/fake_app_stager.go index 39ba63146d4..8c46eca4039 100644 --- a/command/v7/shared/sharedfakes/fake_app_stager.go +++ b/command/v7/shared/sharedfakes/fake_app_stager.go @@ -4,23 +4,20 @@ package sharedfakes import ( "sync" - "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" "code.cloudfoundry.org/cli/command/v7/shared" "code.cloudfoundry.org/cli/resources" "code.cloudfoundry.org/cli/util/configv3" ) type FakeAppStager struct { - StageAndStartStub func(resources.Application, configv3.Space, configv3.Organization, string, constant.DeploymentStrategy, bool, constant.ApplicationAction) error + StageAndStartStub func(resources.Application, configv3.Space, configv3.Organization, string, shared.AppStartOpts) error stageAndStartMutex sync.RWMutex stageAndStartArgsForCall []struct { arg1 resources.Application arg2 configv3.Space arg3 configv3.Organization arg4 string - arg5 constant.DeploymentStrategy - arg6 bool - arg7 constant.ApplicationAction + arg5 shared.AppStartOpts } stageAndStartReturns struct { result1 error @@ -43,16 +40,14 @@ type FakeAppStager struct { result1 resources.Droplet result2 error } - StartAppStub func(resources.Application, string, constant.DeploymentStrategy, bool, configv3.Space, configv3.Organization, constant.ApplicationAction) error + StartAppStub func(resources.Application, configv3.Space, configv3.Organization, string, shared.AppStartOpts) error startAppMutex sync.RWMutex startAppArgsForCall []struct { arg1 resources.Application - arg2 string - arg3 constant.DeploymentStrategy - arg4 bool - arg5 configv3.Space - arg6 configv3.Organization - arg7 constant.ApplicationAction + arg2 configv3.Space + arg3 configv3.Organization + arg4 string + arg5 shared.AppStartOpts } startAppReturns struct { result1 error @@ -64,7 +59,7 @@ type FakeAppStager struct { invocationsMutex sync.RWMutex } -func (fake *FakeAppStager) StageAndStart(arg1 resources.Application, arg2 configv3.Space, arg3 configv3.Organization, arg4 string, arg5 constant.DeploymentStrategy, arg6 bool, arg7 constant.ApplicationAction) error { +func (fake *FakeAppStager) StageAndStart(arg1 resources.Application, arg2 configv3.Space, arg3 configv3.Organization, arg4 string, arg5 shared.AppStartOpts) error { fake.stageAndStartMutex.Lock() ret, specificReturn := fake.stageAndStartReturnsOnCall[len(fake.stageAndStartArgsForCall)] fake.stageAndStartArgsForCall = append(fake.stageAndStartArgsForCall, struct { @@ -72,19 +67,18 @@ func (fake *FakeAppStager) StageAndStart(arg1 resources.Application, arg2 config arg2 configv3.Space arg3 configv3.Organization arg4 string - arg5 constant.DeploymentStrategy - arg6 bool - arg7 constant.ApplicationAction - }{arg1, arg2, arg3, arg4, arg5, arg6, arg7}) - fake.recordInvocation("StageAndStart", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6, arg7}) + arg5 shared.AppStartOpts + }{arg1, arg2, arg3, arg4, arg5}) + stub := fake.StageAndStartStub + fakeReturns := fake.stageAndStartReturns + fake.recordInvocation("StageAndStart", []interface{}{arg1, arg2, arg3, arg4, arg5}) fake.stageAndStartMutex.Unlock() - if fake.StageAndStartStub != nil { - return fake.StageAndStartStub(arg1, arg2, arg3, arg4, arg5, arg6, arg7) + if stub != nil { + return stub(arg1, arg2, arg3, arg4, arg5) } if specificReturn { return ret.result1 } - fakeReturns := fake.stageAndStartReturns return fakeReturns.result1 } @@ -94,17 +88,17 @@ func (fake *FakeAppStager) StageAndStartCallCount() int { return len(fake.stageAndStartArgsForCall) } -func (fake *FakeAppStager) StageAndStartCalls(stub func(resources.Application, configv3.Space, configv3.Organization, string, constant.DeploymentStrategy, bool, constant.ApplicationAction) error) { +func (fake *FakeAppStager) StageAndStartCalls(stub func(resources.Application, configv3.Space, configv3.Organization, string, shared.AppStartOpts) error) { fake.stageAndStartMutex.Lock() defer fake.stageAndStartMutex.Unlock() fake.StageAndStartStub = stub } -func (fake *FakeAppStager) StageAndStartArgsForCall(i int) (resources.Application, configv3.Space, configv3.Organization, string, constant.DeploymentStrategy, bool, constant.ApplicationAction) { +func (fake *FakeAppStager) StageAndStartArgsForCall(i int) (resources.Application, configv3.Space, configv3.Organization, string, shared.AppStartOpts) { fake.stageAndStartMutex.RLock() defer fake.stageAndStartMutex.RUnlock() argsForCall := fake.stageAndStartArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6, argsForCall.arg7 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 } func (fake *FakeAppStager) StageAndStartReturns(result1 error) { @@ -138,15 +132,16 @@ func (fake *FakeAppStager) StageApp(arg1 resources.Application, arg2 string, arg arg2 string arg3 configv3.Space }{arg1, arg2, arg3}) + stub := fake.StageAppStub + fakeReturns := fake.stageAppReturns fake.recordInvocation("StageApp", []interface{}{arg1, arg2, arg3}) fake.stageAppMutex.Unlock() - if fake.StageAppStub != nil { - return fake.StageAppStub(arg1, arg2, arg3) + if stub != nil { + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1, ret.result2 } - fakeReturns := fake.stageAppReturns return fakeReturns.result1, fakeReturns.result2 } @@ -195,27 +190,26 @@ func (fake *FakeAppStager) StageAppReturnsOnCall(i int, result1 resources.Drople }{result1, result2} } -func (fake *FakeAppStager) StartApp(arg1 resources.Application, arg2 string, arg3 constant.DeploymentStrategy, arg4 bool, arg5 configv3.Space, arg6 configv3.Organization, arg7 constant.ApplicationAction) error { +func (fake *FakeAppStager) StartApp(arg1 resources.Application, arg2 configv3.Space, arg3 configv3.Organization, arg4 string, arg5 shared.AppStartOpts) error { fake.startAppMutex.Lock() ret, specificReturn := fake.startAppReturnsOnCall[len(fake.startAppArgsForCall)] fake.startAppArgsForCall = append(fake.startAppArgsForCall, struct { arg1 resources.Application - arg2 string - arg3 constant.DeploymentStrategy - arg4 bool - arg5 configv3.Space - arg6 configv3.Organization - arg7 constant.ApplicationAction - }{arg1, arg2, arg3, arg4, arg5, arg6, arg7}) - fake.recordInvocation("StartApp", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6, arg7}) + arg2 configv3.Space + arg3 configv3.Organization + arg4 string + arg5 shared.AppStartOpts + }{arg1, arg2, arg3, arg4, arg5}) + stub := fake.StartAppStub + fakeReturns := fake.startAppReturns + fake.recordInvocation("StartApp", []interface{}{arg1, arg2, arg3, arg4, arg5}) fake.startAppMutex.Unlock() - if fake.StartAppStub != nil { - return fake.StartAppStub(arg1, arg2, arg3, arg4, arg5, arg6, arg7) + if stub != nil { + return stub(arg1, arg2, arg3, arg4, arg5) } if specificReturn { return ret.result1 } - fakeReturns := fake.startAppReturns return fakeReturns.result1 } @@ -225,17 +219,17 @@ func (fake *FakeAppStager) StartAppCallCount() int { return len(fake.startAppArgsForCall) } -func (fake *FakeAppStager) StartAppCalls(stub func(resources.Application, string, constant.DeploymentStrategy, bool, configv3.Space, configv3.Organization, constant.ApplicationAction) error) { +func (fake *FakeAppStager) StartAppCalls(stub func(resources.Application, configv3.Space, configv3.Organization, string, shared.AppStartOpts) error) { fake.startAppMutex.Lock() defer fake.startAppMutex.Unlock() fake.StartAppStub = stub } -func (fake *FakeAppStager) StartAppArgsForCall(i int) (resources.Application, string, constant.DeploymentStrategy, bool, configv3.Space, configv3.Organization, constant.ApplicationAction) { +func (fake *FakeAppStager) StartAppArgsForCall(i int) (resources.Application, configv3.Space, configv3.Organization, string, shared.AppStartOpts) { fake.startAppMutex.RLock() defer fake.startAppMutex.RUnlock() argsForCall := fake.startAppArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6, argsForCall.arg7 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 } func (fake *FakeAppStager) StartAppReturns(result1 error) { diff --git a/command/v7/start_command.go b/command/v7/start_command.go index 823341ff29c..3316ab5474e 100644 --- a/command/v7/start_command.go +++ b/command/v7/start_command.go @@ -62,6 +62,12 @@ func (cmd StartCommand) Execute(args []string) error { return err } + opts := shared.AppStartOpts{ + Strategy: constant.DeploymentStrategyDefault, + NoWait: false, + AppAction: constant.ApplicationStarting, + } + if packageGUID != "" && app.Stopped() { cmd.UI.DisplayTextWithFlavor("Starting app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{ "AppName": cmd.RequiredArgs.AppName, @@ -71,17 +77,8 @@ func (cmd StartCommand) Execute(args []string) error { }) cmd.UI.DisplayNewline() - err = cmd.Stager.StageAndStart(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), packageGUID, constant.DeploymentStrategyDefault, false, constant.ApplicationStarting) - if err != nil { - return err - } - } else { - err = cmd.Stager.StartApp(app, "", constant.DeploymentStrategyDefault, false, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), constant.ApplicationStarting) - if err != nil { - return err - } + return cmd.Stager.StageAndStart(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), packageGUID, opts) } - return nil - + return cmd.Stager.StartApp(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), "", opts) } diff --git a/command/v7/start_command_test.go b/command/v7/start_command_test.go index 6575fcca8f7..bc8a1c2759d 100644 --- a/command/v7/start_command_test.go +++ b/command/v7/start_command_test.go @@ -140,14 +140,14 @@ var _ = Describe("start Command", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(fakeAppStager.StageAndStartCallCount()).To(Equal(1)) - inputApp, inputSpace, inputOrg, inputPkgGUID, inputStrategy, inputNoWait, inputAppAction := fakeAppStager.StageAndStartArgsForCall(0) + inputApp, inputSpace, inputOrg, inputPkgGUID, opts := fakeAppStager.StageAndStartArgsForCall(0) Expect(inputApp).To(Equal(app)) Expect(inputSpace).To(Equal(cmd.Config.TargetedSpace())) Expect(inputOrg).To(Equal(cmd.Config.TargetedOrganization())) Expect(inputPkgGUID).To(Equal("package-guid")) - Expect(inputStrategy).To(Equal(constant.DeploymentStrategyDefault)) - Expect(inputNoWait).To(Equal(false)) - Expect(inputAppAction).To(Equal(constant.ApplicationStarting)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyDefault)) + Expect(opts.NoWait).To(Equal(false)) + Expect(opts.AppAction).To(Equal(constant.ApplicationStarting)) }) When("staging and starting the app returns an error", func() { @@ -171,14 +171,14 @@ var _ = Describe("start Command", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(fakeAppStager.StartAppCallCount()).To(Equal(1)) - inputApp, inputDropletGuid, inputStrategy, inputNoWait, inputSpace, inputOrg, inputAppAction := fakeAppStager.StartAppArgsForCall(0) + inputApp, inputSpace, inputOrg, inputDropletGuid, opts := fakeAppStager.StartAppArgsForCall(0) Expect(inputApp).To(Equal(app)) Expect(inputDropletGuid).To(Equal("")) - Expect(inputStrategy).To(Equal(constant.DeploymentStrategyDefault)) - Expect(inputNoWait).To(Equal(false)) Expect(inputSpace).To(Equal(cmd.Config.TargetedSpace())) Expect(inputOrg).To(Equal(cmd.Config.TargetedOrganization())) - Expect(inputAppAction).To(Equal(constant.ApplicationStarting)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyDefault)) + Expect(opts.NoWait).To(Equal(false)) + Expect(opts.AppAction).To(Equal(constant.ApplicationStarting)) }) When("starting the app returns an error", func() { @@ -202,14 +202,14 @@ var _ = Describe("start Command", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(fakeAppStager.StartAppCallCount()).To(Equal(1)) - inputApp, inputDropletGuid, inputStrategy, inputNoWait, inputSpace, inputOrg, inputAppAction := fakeAppStager.StartAppArgsForCall(0) + inputApp, inputSpace, inputOrg, inputDropletGuid, opts := fakeAppStager.StartAppArgsForCall(0) Expect(inputApp).To(Equal(app)) Expect(inputDropletGuid).To(Equal("")) - Expect(inputStrategy).To(Equal(constant.DeploymentStrategyDefault)) - Expect(inputNoWait).To(Equal(false)) Expect(inputSpace).To(Equal(cmd.Config.TargetedSpace())) Expect(inputOrg).To(Equal(cmd.Config.TargetedOrganization())) - Expect(inputAppAction).To(Equal(constant.ApplicationStarting)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyDefault)) + Expect(opts.NoWait).To(Equal(false)) + Expect(opts.AppAction).To(Equal(constant.ApplicationStarting)) }) When("starting the app returns an error", func() { diff --git a/command/v7/v7fakes/fake_actor.go b/command/v7/v7fakes/fake_actor.go index 9307ec8da73..12df707c491 100644 --- a/command/v7/v7fakes/fake_actor.go +++ b/command/v7/v7fakes/fake_actor.go @@ -128,6 +128,19 @@ type FakeActor struct { clearTargetMutex sync.RWMutex clearTargetArgsForCall []struct { } + ContinueDeploymentStub func(string) (v7action.Warnings, error) + continueDeploymentMutex sync.RWMutex + continueDeploymentArgsForCall []struct { + arg1 string + } + continueDeploymentReturns struct { + result1 v7action.Warnings + result2 error + } + continueDeploymentReturnsOnCall map[int]struct { + result1 v7action.Warnings + result2 error + } CopyPackageStub func(resources.Application, resources.Application) (resources.Package, v7action.Warnings, error) copyPackageMutex sync.RWMutex copyPackageArgsForCall []struct { @@ -222,34 +235,17 @@ type FakeActor struct { result2 v7action.Warnings result3 error } - CreateDeploymentByApplicationAndDropletStub func(string, string) (string, v7action.Warnings, error) - createDeploymentByApplicationAndDropletMutex sync.RWMutex - createDeploymentByApplicationAndDropletArgsForCall []struct { - arg1 string - arg2 string + CreateDeploymentStub func(resources.Deployment) (string, v7action.Warnings, error) + createDeploymentMutex sync.RWMutex + createDeploymentArgsForCall []struct { + arg1 resources.Deployment } - createDeploymentByApplicationAndDropletReturns struct { + createDeploymentReturns struct { result1 string result2 v7action.Warnings result3 error } - createDeploymentByApplicationAndDropletReturnsOnCall map[int]struct { - result1 string - result2 v7action.Warnings - result3 error - } - CreateDeploymentByApplicationAndRevisionStub func(string, string) (string, v7action.Warnings, error) - createDeploymentByApplicationAndRevisionMutex sync.RWMutex - createDeploymentByApplicationAndRevisionArgsForCall []struct { - arg1 string - arg2 string - } - createDeploymentByApplicationAndRevisionReturns struct { - result1 string - result2 v7action.Warnings - result3 error - } - createDeploymentByApplicationAndRevisionReturnsOnCall map[int]struct { + createDeploymentReturnsOnCall map[int]struct { result1 string result2 v7action.Warnings result3 error @@ -2563,19 +2559,19 @@ type FakeActor struct { result1 v7action.Warnings result2 error } - PollStartForRollingStub func(resources.Application, string, bool, func(string)) (v7action.Warnings, error) - pollStartForRollingMutex sync.RWMutex - pollStartForRollingArgsForCall []struct { + PollStartForDeploymentStub func(resources.Application, string, bool, func(string)) (v7action.Warnings, error) + pollStartForDeploymentMutex sync.RWMutex + pollStartForDeploymentArgsForCall []struct { arg1 resources.Application arg2 string arg3 bool arg4 func(string) } - pollStartForRollingReturns struct { + pollStartForDeploymentReturns struct { result1 v7action.Warnings result2 error } - pollStartForRollingReturnsOnCall map[int]struct { + pollStartForDeploymentReturnsOnCall map[int]struct { result1 v7action.Warnings result2 error } @@ -4125,6 +4121,70 @@ func (fake *FakeActor) ClearTargetCalls(stub func()) { fake.ClearTargetStub = stub } +func (fake *FakeActor) ContinueDeployment(arg1 string) (v7action.Warnings, error) { + fake.continueDeploymentMutex.Lock() + ret, specificReturn := fake.continueDeploymentReturnsOnCall[len(fake.continueDeploymentArgsForCall)] + fake.continueDeploymentArgsForCall = append(fake.continueDeploymentArgsForCall, struct { + arg1 string + }{arg1}) + stub := fake.ContinueDeploymentStub + fakeReturns := fake.continueDeploymentReturns + fake.recordInvocation("ContinueDeployment", []interface{}{arg1}) + fake.continueDeploymentMutex.Unlock() + if stub != nil { + return stub(arg1) + } + if specificReturn { + return ret.result1, ret.result2 + } + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeActor) ContinueDeploymentCallCount() int { + fake.continueDeploymentMutex.RLock() + defer fake.continueDeploymentMutex.RUnlock() + return len(fake.continueDeploymentArgsForCall) +} + +func (fake *FakeActor) ContinueDeploymentCalls(stub func(string) (v7action.Warnings, error)) { + fake.continueDeploymentMutex.Lock() + defer fake.continueDeploymentMutex.Unlock() + fake.ContinueDeploymentStub = stub +} + +func (fake *FakeActor) ContinueDeploymentArgsForCall(i int) string { + fake.continueDeploymentMutex.RLock() + defer fake.continueDeploymentMutex.RUnlock() + argsForCall := fake.continueDeploymentArgsForCall[i] + return argsForCall.arg1 +} + +func (fake *FakeActor) ContinueDeploymentReturns(result1 v7action.Warnings, result2 error) { + fake.continueDeploymentMutex.Lock() + defer fake.continueDeploymentMutex.Unlock() + fake.ContinueDeploymentStub = nil + fake.continueDeploymentReturns = struct { + result1 v7action.Warnings + result2 error + }{result1, result2} +} + +func (fake *FakeActor) ContinueDeploymentReturnsOnCall(i int, result1 v7action.Warnings, result2 error) { + fake.continueDeploymentMutex.Lock() + defer fake.continueDeploymentMutex.Unlock() + fake.ContinueDeploymentStub = nil + if fake.continueDeploymentReturnsOnCall == nil { + fake.continueDeploymentReturnsOnCall = make(map[int]struct { + result1 v7action.Warnings + result2 error + }) + } + fake.continueDeploymentReturnsOnCall[i] = struct { + result1 v7action.Warnings + result2 error + }{result1, result2} +} + func (fake *FakeActor) CopyPackage(arg1 resources.Application, arg2 resources.Application) (resources.Package, v7action.Warnings, error) { fake.copyPackageMutex.Lock() ret, specificReturn := fake.copyPackageReturnsOnCall[len(fake.copyPackageArgsForCall)] @@ -4531,87 +4591,18 @@ func (fake *FakeActor) CreateBuildpackReturnsOnCall(i int, result1 resources.Bui }{result1, result2, result3} } -func (fake *FakeActor) CreateDeploymentByApplicationAndDroplet(arg1 string, arg2 string) (string, v7action.Warnings, error) { - fake.createDeploymentByApplicationAndDropletMutex.Lock() - ret, specificReturn := fake.createDeploymentByApplicationAndDropletReturnsOnCall[len(fake.createDeploymentByApplicationAndDropletArgsForCall)] - fake.createDeploymentByApplicationAndDropletArgsForCall = append(fake.createDeploymentByApplicationAndDropletArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.CreateDeploymentByApplicationAndDropletStub - fakeReturns := fake.createDeploymentByApplicationAndDropletReturns - fake.recordInvocation("CreateDeploymentByApplicationAndDroplet", []interface{}{arg1, arg2}) - fake.createDeploymentByApplicationAndDropletMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *FakeActor) CreateDeploymentByApplicationAndDropletCallCount() int { - fake.createDeploymentByApplicationAndDropletMutex.RLock() - defer fake.createDeploymentByApplicationAndDropletMutex.RUnlock() - return len(fake.createDeploymentByApplicationAndDropletArgsForCall) -} - -func (fake *FakeActor) CreateDeploymentByApplicationAndDropletCalls(stub func(string, string) (string, v7action.Warnings, error)) { - fake.createDeploymentByApplicationAndDropletMutex.Lock() - defer fake.createDeploymentByApplicationAndDropletMutex.Unlock() - fake.CreateDeploymentByApplicationAndDropletStub = stub -} - -func (fake *FakeActor) CreateDeploymentByApplicationAndDropletArgsForCall(i int) (string, string) { - fake.createDeploymentByApplicationAndDropletMutex.RLock() - defer fake.createDeploymentByApplicationAndDropletMutex.RUnlock() - argsForCall := fake.createDeploymentByApplicationAndDropletArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *FakeActor) CreateDeploymentByApplicationAndDropletReturns(result1 string, result2 v7action.Warnings, result3 error) { - fake.createDeploymentByApplicationAndDropletMutex.Lock() - defer fake.createDeploymentByApplicationAndDropletMutex.Unlock() - fake.CreateDeploymentByApplicationAndDropletStub = nil - fake.createDeploymentByApplicationAndDropletReturns = struct { - result1 string - result2 v7action.Warnings - result3 error - }{result1, result2, result3} -} - -func (fake *FakeActor) CreateDeploymentByApplicationAndDropletReturnsOnCall(i int, result1 string, result2 v7action.Warnings, result3 error) { - fake.createDeploymentByApplicationAndDropletMutex.Lock() - defer fake.createDeploymentByApplicationAndDropletMutex.Unlock() - fake.CreateDeploymentByApplicationAndDropletStub = nil - if fake.createDeploymentByApplicationAndDropletReturnsOnCall == nil { - fake.createDeploymentByApplicationAndDropletReturnsOnCall = make(map[int]struct { - result1 string - result2 v7action.Warnings - result3 error - }) - } - fake.createDeploymentByApplicationAndDropletReturnsOnCall[i] = struct { - result1 string - result2 v7action.Warnings - result3 error - }{result1, result2, result3} -} - -func (fake *FakeActor) CreateDeploymentByApplicationAndRevision(arg1 string, arg2 string) (string, v7action.Warnings, error) { - fake.createDeploymentByApplicationAndRevisionMutex.Lock() - ret, specificReturn := fake.createDeploymentByApplicationAndRevisionReturnsOnCall[len(fake.createDeploymentByApplicationAndRevisionArgsForCall)] - fake.createDeploymentByApplicationAndRevisionArgsForCall = append(fake.createDeploymentByApplicationAndRevisionArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.CreateDeploymentByApplicationAndRevisionStub - fakeReturns := fake.createDeploymentByApplicationAndRevisionReturns - fake.recordInvocation("CreateDeploymentByApplicationAndRevision", []interface{}{arg1, arg2}) - fake.createDeploymentByApplicationAndRevisionMutex.Unlock() +func (fake *FakeActor) CreateDeployment(arg1 resources.Deployment) (string, v7action.Warnings, error) { + fake.createDeploymentMutex.Lock() + ret, specificReturn := fake.createDeploymentReturnsOnCall[len(fake.createDeploymentArgsForCall)] + fake.createDeploymentArgsForCall = append(fake.createDeploymentArgsForCall, struct { + arg1 resources.Deployment + }{arg1}) + stub := fake.CreateDeploymentStub + fakeReturns := fake.createDeploymentReturns + fake.recordInvocation("CreateDeployment", []interface{}{arg1}) + fake.createDeploymentMutex.Unlock() if stub != nil { - return stub(arg1, arg2) + return stub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3 @@ -4619,48 +4610,48 @@ func (fake *FakeActor) CreateDeploymentByApplicationAndRevision(arg1 string, arg return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 } -func (fake *FakeActor) CreateDeploymentByApplicationAndRevisionCallCount() int { - fake.createDeploymentByApplicationAndRevisionMutex.RLock() - defer fake.createDeploymentByApplicationAndRevisionMutex.RUnlock() - return len(fake.createDeploymentByApplicationAndRevisionArgsForCall) +func (fake *FakeActor) CreateDeploymentCallCount() int { + fake.createDeploymentMutex.RLock() + defer fake.createDeploymentMutex.RUnlock() + return len(fake.createDeploymentArgsForCall) } -func (fake *FakeActor) CreateDeploymentByApplicationAndRevisionCalls(stub func(string, string) (string, v7action.Warnings, error)) { - fake.createDeploymentByApplicationAndRevisionMutex.Lock() - defer fake.createDeploymentByApplicationAndRevisionMutex.Unlock() - fake.CreateDeploymentByApplicationAndRevisionStub = stub +func (fake *FakeActor) CreateDeploymentCalls(stub func(resources.Deployment) (string, v7action.Warnings, error)) { + fake.createDeploymentMutex.Lock() + defer fake.createDeploymentMutex.Unlock() + fake.CreateDeploymentStub = stub } -func (fake *FakeActor) CreateDeploymentByApplicationAndRevisionArgsForCall(i int) (string, string) { - fake.createDeploymentByApplicationAndRevisionMutex.RLock() - defer fake.createDeploymentByApplicationAndRevisionMutex.RUnlock() - argsForCall := fake.createDeploymentByApplicationAndRevisionArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 +func (fake *FakeActor) CreateDeploymentArgsForCall(i int) resources.Deployment { + fake.createDeploymentMutex.RLock() + defer fake.createDeploymentMutex.RUnlock() + argsForCall := fake.createDeploymentArgsForCall[i] + return argsForCall.arg1 } -func (fake *FakeActor) CreateDeploymentByApplicationAndRevisionReturns(result1 string, result2 v7action.Warnings, result3 error) { - fake.createDeploymentByApplicationAndRevisionMutex.Lock() - defer fake.createDeploymentByApplicationAndRevisionMutex.Unlock() - fake.CreateDeploymentByApplicationAndRevisionStub = nil - fake.createDeploymentByApplicationAndRevisionReturns = struct { +func (fake *FakeActor) CreateDeploymentReturns(result1 string, result2 v7action.Warnings, result3 error) { + fake.createDeploymentMutex.Lock() + defer fake.createDeploymentMutex.Unlock() + fake.CreateDeploymentStub = nil + fake.createDeploymentReturns = struct { result1 string result2 v7action.Warnings result3 error }{result1, result2, result3} } -func (fake *FakeActor) CreateDeploymentByApplicationAndRevisionReturnsOnCall(i int, result1 string, result2 v7action.Warnings, result3 error) { - fake.createDeploymentByApplicationAndRevisionMutex.Lock() - defer fake.createDeploymentByApplicationAndRevisionMutex.Unlock() - fake.CreateDeploymentByApplicationAndRevisionStub = nil - if fake.createDeploymentByApplicationAndRevisionReturnsOnCall == nil { - fake.createDeploymentByApplicationAndRevisionReturnsOnCall = make(map[int]struct { +func (fake *FakeActor) CreateDeploymentReturnsOnCall(i int, result1 string, result2 v7action.Warnings, result3 error) { + fake.createDeploymentMutex.Lock() + defer fake.createDeploymentMutex.Unlock() + fake.CreateDeploymentStub = nil + if fake.createDeploymentReturnsOnCall == nil { + fake.createDeploymentReturnsOnCall = make(map[int]struct { result1 string result2 v7action.Warnings result3 error }) } - fake.createDeploymentByApplicationAndRevisionReturnsOnCall[i] = struct { + fake.createDeploymentReturnsOnCall[i] = struct { result1 string result2 v7action.Warnings result3 error @@ -14719,19 +14710,19 @@ func (fake *FakeActor) PollStartReturnsOnCall(i int, result1 v7action.Warnings, }{result1, result2} } -func (fake *FakeActor) PollStartForRolling(arg1 resources.Application, arg2 string, arg3 bool, arg4 func(string)) (v7action.Warnings, error) { - fake.pollStartForRollingMutex.Lock() - ret, specificReturn := fake.pollStartForRollingReturnsOnCall[len(fake.pollStartForRollingArgsForCall)] - fake.pollStartForRollingArgsForCall = append(fake.pollStartForRollingArgsForCall, struct { +func (fake *FakeActor) PollStartForDeployment(arg1 resources.Application, arg2 string, arg3 bool, arg4 func(string)) (v7action.Warnings, error) { + fake.pollStartForDeploymentMutex.Lock() + ret, specificReturn := fake.pollStartForDeploymentReturnsOnCall[len(fake.pollStartForDeploymentArgsForCall)] + fake.pollStartForDeploymentArgsForCall = append(fake.pollStartForDeploymentArgsForCall, struct { arg1 resources.Application arg2 string arg3 bool arg4 func(string) }{arg1, arg2, arg3, arg4}) - stub := fake.PollStartForRollingStub - fakeReturns := fake.pollStartForRollingReturns - fake.recordInvocation("PollStartForRolling", []interface{}{arg1, arg2, arg3, arg4}) - fake.pollStartForRollingMutex.Unlock() + stub := fake.PollStartForDeploymentStub + fakeReturns := fake.pollStartForDeploymentReturns + fake.recordInvocation("PollStartForDeployment", []interface{}{arg1, arg2, arg3, arg4}) + fake.pollStartForDeploymentMutex.Unlock() if stub != nil { return stub(arg1, arg2, arg3, arg4) } @@ -14741,46 +14732,46 @@ func (fake *FakeActor) PollStartForRolling(arg1 resources.Application, arg2 stri return fakeReturns.result1, fakeReturns.result2 } -func (fake *FakeActor) PollStartForRollingCallCount() int { - fake.pollStartForRollingMutex.RLock() - defer fake.pollStartForRollingMutex.RUnlock() - return len(fake.pollStartForRollingArgsForCall) +func (fake *FakeActor) PollStartForDeploymentCallCount() int { + fake.pollStartForDeploymentMutex.RLock() + defer fake.pollStartForDeploymentMutex.RUnlock() + return len(fake.pollStartForDeploymentArgsForCall) } -func (fake *FakeActor) PollStartForRollingCalls(stub func(resources.Application, string, bool, func(string)) (v7action.Warnings, error)) { - fake.pollStartForRollingMutex.Lock() - defer fake.pollStartForRollingMutex.Unlock() - fake.PollStartForRollingStub = stub +func (fake *FakeActor) PollStartForDeploymentCalls(stub func(resources.Application, string, bool, func(string)) (v7action.Warnings, error)) { + fake.pollStartForDeploymentMutex.Lock() + defer fake.pollStartForDeploymentMutex.Unlock() + fake.PollStartForDeploymentStub = stub } -func (fake *FakeActor) PollStartForRollingArgsForCall(i int) (resources.Application, string, bool, func(string)) { - fake.pollStartForRollingMutex.RLock() - defer fake.pollStartForRollingMutex.RUnlock() - argsForCall := fake.pollStartForRollingArgsForCall[i] +func (fake *FakeActor) PollStartForDeploymentArgsForCall(i int) (resources.Application, string, bool, func(string)) { + fake.pollStartForDeploymentMutex.RLock() + defer fake.pollStartForDeploymentMutex.RUnlock() + argsForCall := fake.pollStartForDeploymentArgsForCall[i] return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 } -func (fake *FakeActor) PollStartForRollingReturns(result1 v7action.Warnings, result2 error) { - fake.pollStartForRollingMutex.Lock() - defer fake.pollStartForRollingMutex.Unlock() - fake.PollStartForRollingStub = nil - fake.pollStartForRollingReturns = struct { +func (fake *FakeActor) PollStartForDeploymentReturns(result1 v7action.Warnings, result2 error) { + fake.pollStartForDeploymentMutex.Lock() + defer fake.pollStartForDeploymentMutex.Unlock() + fake.PollStartForDeploymentStub = nil + fake.pollStartForDeploymentReturns = struct { result1 v7action.Warnings result2 error }{result1, result2} } -func (fake *FakeActor) PollStartForRollingReturnsOnCall(i int, result1 v7action.Warnings, result2 error) { - fake.pollStartForRollingMutex.Lock() - defer fake.pollStartForRollingMutex.Unlock() - fake.PollStartForRollingStub = nil - if fake.pollStartForRollingReturnsOnCall == nil { - fake.pollStartForRollingReturnsOnCall = make(map[int]struct { +func (fake *FakeActor) PollStartForDeploymentReturnsOnCall(i int, result1 v7action.Warnings, result2 error) { + fake.pollStartForDeploymentMutex.Lock() + defer fake.pollStartForDeploymentMutex.Unlock() + fake.PollStartForDeploymentStub = nil + if fake.pollStartForDeploymentReturnsOnCall == nil { + fake.pollStartForDeploymentReturnsOnCall = make(map[int]struct { result1 v7action.Warnings result2 error }) } - fake.pollStartForRollingReturnsOnCall[i] = struct { + fake.pollStartForDeploymentReturnsOnCall[i] = struct { result1 v7action.Warnings result2 error }{result1, result2} @@ -19501,6 +19492,8 @@ func (fake *FakeActor) Invocations() map[string][][]interface{} { defer fake.checkRouteMutex.RUnlock() fake.clearTargetMutex.RLock() defer fake.clearTargetMutex.RUnlock() + fake.continueDeploymentMutex.RLock() + defer fake.continueDeploymentMutex.RUnlock() fake.copyPackageMutex.RLock() defer fake.copyPackageMutex.RUnlock() fake.createAndUploadBitsPackageByApplicationNameAndSpaceMutex.RLock() @@ -19513,10 +19506,8 @@ func (fake *FakeActor) Invocations() map[string][][]interface{} { defer fake.createBitsPackageByApplicationMutex.RUnlock() fake.createBuildpackMutex.RLock() defer fake.createBuildpackMutex.RUnlock() - fake.createDeploymentByApplicationAndDropletMutex.RLock() - defer fake.createDeploymentByApplicationAndDropletMutex.RUnlock() - fake.createDeploymentByApplicationAndRevisionMutex.RLock() - defer fake.createDeploymentByApplicationAndRevisionMutex.RUnlock() + fake.createDeploymentMutex.RLock() + defer fake.createDeploymentMutex.RUnlock() fake.createDockerPackageByApplicationMutex.RLock() defer fake.createDockerPackageByApplicationMutex.RUnlock() fake.createDockerPackageByApplicationNameAndSpaceMutex.RLock() @@ -19819,8 +19810,8 @@ func (fake *FakeActor) Invocations() map[string][][]interface{} { defer fake.pollPackageMutex.RUnlock() fake.pollStartMutex.RLock() defer fake.pollStartMutex.RUnlock() - fake.pollStartForRollingMutex.RLock() - defer fake.pollStartForRollingMutex.RUnlock() + fake.pollStartForDeploymentMutex.RLock() + defer fake.pollStartForDeploymentMutex.RUnlock() fake.pollTaskMutex.RLock() defer fake.pollTaskMutex.RUnlock() fake.pollUploadBuildpackJobMutex.RLock() diff --git a/integration/v7/isolated/app_command_test.go b/integration/v7/isolated/app_command_test.go index 524418626f4..4fe317aa157 100644 --- a/integration/v7/isolated/app_command_test.go +++ b/integration/v7/isolated/app_command_test.go @@ -285,6 +285,29 @@ applications: }) }) }) + + When("the deployment strategy is canary", func() { + When("the deployment is paused", func() { + It("displays the message", func() { + Eventually(helpers.CF("restart", appName, "--strategy", "canary")).Should(Exit(0)) + + session1 := helpers.CF("app", appName) + Eventually(session1).Should(Say("Canary deployment currently PAUSED.")) + Eventually(session1).Should(Exit(0)) + }) + }) + + When("the deployment is cancelled after it is paused", func() { + It("no deployment information is displayed", func() { + Eventually(helpers.CF("restart", appName, "--strategy", "canary")).Should(Exit(0)) + Eventually(helpers.CF("cancel-deployment", appName)).Should(Exit(0)) + + session2 := helpers.CF("app", appName) + Eventually(session2).ShouldNot(Say("Canary deployment currently CANCELING.")) + Eventually(session2).Should(Exit(0)) + }) + }) + }) }) When("there is no active deployment", func() { diff --git a/integration/v7/isolated/cancel_deployment_test.go b/integration/v7/isolated/cancel_deployment_test.go index 7b0d4dc01ec..7a2d1066a86 100644 --- a/integration/v7/isolated/cancel_deployment_test.go +++ b/integration/v7/isolated/cancel_deployment_test.go @@ -90,16 +90,32 @@ var _ = Describe("Cancel Deployment", func() { }) }) - It("succeeds", func() { - helpers.WithHelloWorldApp(func(appDir string) { - Eventually(helpers.CF("push", appName, "-p", appDir, "--strategy=rolling", "--no-wait")).Should(Exit(0)) + When("There is a rolling deployment", func() { + It("succeeds", func() { + helpers.WithHelloWorldApp(func(appDir string) { + Eventually(helpers.CF("push", appName, "-p", appDir, "--strategy=rolling", "--no-wait")).Should(Exit(0)) + }) + + session := helpers.CF("cancel-deployment", appName) + Eventually(session).Should(Say(fmt.Sprintf("Canceling deployment for app %s in org %s / space %s as %s...", appName, orgName, spaceName, userName))) + Eventually(session).Should(Say("OK")) + Eventually(session).Should(Say(fmt.Sprintf(`TIP: Run 'cf app %s' to view app status.`, appName))) + Eventually(session).Should(Exit(0)) }) + }) - session := helpers.CF("cancel-deployment", appName) - Eventually(session).Should(Say(fmt.Sprintf("Canceling deployment for app %s in org %s / space %s as %s...", appName, orgName, spaceName, userName))) - Eventually(session).Should(Say("OK")) - Eventually(session).Should(Say(fmt.Sprintf(`TIP: Run 'cf app %s' to view app status.`, appName))) - Eventually(session).Should(Exit(0)) + When("There is a canary deployment", func() { + It("succeeds", func() { + helpers.WithHelloWorldApp(func(appDir string) { + Eventually(helpers.CF("push", appName, "-p", appDir, "--strategy=canary", "--no-wait")).Should(Exit(0)) + }) + + session := helpers.CF("cancel-deployment", appName) + Eventually(session).Should(Say(fmt.Sprintf("Canceling deployment for app %s in org %s / space %s as %s...", appName, orgName, spaceName, userName))) + Eventually(session).Should(Say("OK")) + Eventually(session).Should(Say(fmt.Sprintf(`TIP: Run 'cf app %s' to view app status.`, appName))) + Eventually(session).Should(Exit(0)) + }) }) }) }) diff --git a/integration/v7/isolated/continue_deployment_test.go b/integration/v7/isolated/continue_deployment_test.go new file mode 100644 index 00000000000..18ea3dab317 --- /dev/null +++ b/integration/v7/isolated/continue_deployment_test.go @@ -0,0 +1,101 @@ +package isolated + +import ( + "fmt" + + "code.cloudfoundry.org/cli/integration/helpers" + + . "code.cloudfoundry.org/cli/cf/util/testhelpers/matchers" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/onsi/gomega/gbytes" + . "github.com/onsi/gomega/gexec" +) + +var _ = Describe("Continue Deployment", func() { + Context("Help", func() { + It("appears in cf help -a", func() { + session := helpers.CF("help", "-a") + Eventually(session).Should(Exit(0)) + Expect(session).To(HaveCommandInCategoryWithDescription("continue-deployment", "APPS", "Continue the most recent deployment for an app.")) + }) + + It("displays the help information", func() { + session := helpers.CF("continue-deployment", "--help") + Eventually(session).Should(Say(`NAME:`)) + Eventually(session).Should(Say(`continue-deployment - Continue the most recent deployment for an app.\n`)) + Eventually(session).Should(Say(`\n`)) + + Eventually(session).Should(Say(`USAGE:`)) + Eventually(session).Should(Say(`cf continue-deployment APP_NAME\n`)) + Eventually(session).Should(Say(`\n`)) + + Eventually(session).Should(Say(`EXAMPLES:`)) + Eventually(session).Should(Say(`cf continue-deployment my-app\n`)) + Eventually(session).Should(Say(`\n`)) + + Eventually(session).Should(Say(`SEE ALSO:`)) + Eventually(session).Should(Say(`app, push`)) + + Eventually(session).Should(Exit(0)) + }) + }) + + Context("when the environment is not set up correctly", func() { + It("fails with the appropriate errors", func() { + helpers.CheckEnvironmentTargetedCorrectly(true, true, ReadOnlyOrg, "continue-deployment", "appName") + }) + }) + + Context("When the environment is set up correctly", func() { + var ( + orgName string + spaceName string + appName string + userName string + ) + + BeforeEach(func() { + appName = helpers.NewAppName() + orgName = helpers.NewOrgName() + spaceName = helpers.NewSpaceName() + + helpers.SetupCF(orgName, spaceName) + userName, _ = helpers.GetCredentials() + + helpers.WithHelloWorldApp(func(appDir string) { + Eventually(helpers.CF("push", appName, "-p", appDir, "-b", "staticfile_buildpack", "-i", "3", "--strategy", "canary")).Should(Exit(0)) + }) + }) + + AfterEach(func() { + Eventually(helpers.CF("delete", appName, "-f")).Should(Exit(0)) + }) + + Context("when there are no deployments", func() { + It("errors with a no deployments found error", func() { + session := helpers.CF("continue-deployment", appName) + Eventually(session).Should(Say(fmt.Sprintf("Continuing deployment for app %s in org %s / space %s as %s...", appName, orgName, spaceName, userName))) + Eventually(session.Err).Should(Say(`No active deployment found for app\.`)) + Eventually(session).Should(Say("FAILED")) + Eventually(session).Should(Exit(1)) + }) + }) + + Context("when the continue is successful", func() { + When("There is a canary deployment", func() { + It("succeeds", func() { + helpers.WithHelloWorldApp(func(appDir string) { + helpers.CF("push", appName, "-p", appDir, "--strategy=canary", "--no-wait").Wait() + }) + + session := helpers.CF("continue-deployment", appName) + Eventually(session).Should(Say(fmt.Sprintf("Continuing deployment for app %s in org %s / space %s as %s...", appName, orgName, spaceName, userName))) + Eventually(session).Should(Say(fmt.Sprintf(`TIP: Run 'cf app %s' to view app status.`, appName))) + Eventually(session).Should(Exit(0)) + }) + }) + }) + }) +}) diff --git a/integration/v7/isolated/copy_source_command_test.go b/integration/v7/isolated/copy_source_command_test.go index c44701a6090..83891422636 100644 --- a/integration/v7/isolated/copy_source_command_test.go +++ b/integration/v7/isolated/copy_source_command_test.go @@ -359,6 +359,47 @@ var _ = Describe("copy-source command", func() { }) }) + Describe("command behavior when the --strategy flag is set to canary", func() { + BeforeEach(func() { + orgName = helpers.NewOrgName() + spaceName = helpers.NewSpaceName() + + sourceAppName = helpers.PrefixedRandomName("hello") + targetAppName = helpers.PrefixedRandomName("banana") + + helpers.SetupCF(orgName, spaceName) + + helpers.WithHelloWorldApp(func(appDir string) { + Eventually(helpers.CF("push", sourceAppName, "--no-start", "-p", appDir, "-b", "staticfile_buildpack", "--no-route")).Should(Exit(0)) + }) + + helpers.WithBananaPantsApp(func(appDir string) { + Eventually(helpers.CF("push", targetAppName, "--no-start", "-p", appDir, "-b", "staticfile_buildpack")).Should(Exit(0)) + }) + }) + + AfterEach(func() { + helpers.QuickDeleteOrg(orgName) + }) + + It("copies the app to the provided space using a canary deploy", func() { + username, _ := helpers.GetCredentials() + session := helpers.CF("copy-source", sourceAppName, targetAppName, "--strategy", "canary") + Eventually(session).Should(Say("Copying source from app %s to target app %s in org %s / space %s as %s...", sourceAppName, targetAppName, orgName, spaceName, username)) + Eventually(session).Should(Say("Staging app %s in org %s / space %s as %s...", targetAppName, orgName, spaceName, username)) + Eventually(session).Should(Say("Waiting for app to deploy...")) + Eventually(session).Should(Exit(0)) + + Eventually(helpers.CF("start", targetAppName)).Should(Exit(0)) + resp, err := http.Get(fmt.Sprintf("http://%s.%s", targetAppName, helpers.DefaultSharedDomain())) + Expect(err).ToNot(HaveOccurred()) + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + Expect(err).ToNot(HaveOccurred()) + Expect(string(body)).To(MatchRegexp("hello world")) + }) + }) + Describe("command behavior when the --no-wait flag is passed", func() { BeforeEach(func() { orgName = helpers.NewOrgName() @@ -407,7 +448,7 @@ func helpText(session *Session) { Eventually(session).Should(Say("USAGE:")) Eventually(session).Should(Say(`cf copy-source SOURCE_APP DESTINATION_APP \[-s TARGET_SPACE \[-o TARGET_ORG\]\] \[--no-restart\] \[--strategy STRATEGY\] \[--no-wait\]`)) Eventually(session).Should(Say("OPTIONS:")) - Eventually(session).Should(Say(`--strategy\s+Deployment strategy, either rolling or null`)) + Eventually(session).Should(Say(`--strategy\s+Deployment strategy can be canary, rolling or null`)) Eventually(session).Should(Say(`--no-wait\s+ Exit when the first instance of the web process is healthy`)) Eventually(session).Should(Say(`--no-restart\s+Do not restage the destination application`)) Eventually(session).Should(Say(`--organization, -o\s+Org that contains the destination application`)) diff --git a/integration/v7/isolated/restage_command_test.go b/integration/v7/isolated/restage_command_test.go index 4cc188a0923..08ce275bc18 100644 --- a/integration/v7/isolated/restage_command_test.go +++ b/integration/v7/isolated/restage_command_test.go @@ -23,15 +23,15 @@ var _ = Describe("restage command", func() { Eventually(session).ShouldNot(Say(`This action will cause app downtime.`)) Eventually(session).Should(Say("USAGE:")) Eventually(session).Should(Say("cf restage APP_NAME")) - Eventually(session).Should(Say("This command will cause downtime unless you use '--strategy rolling'.")) + Eventually(session).Should(Say("This command will cause downtime unless you use '--strategy")) Eventually(session).Should(Say("EXAMPLES:")) Eventually(session).Should(Say("cf restage APP_NAME")) Eventually(session).Should(Say("cf restage APP_NAME --strategy rolling")) - Eventually(session).Should(Say("cf restage APP_NAME --strategy rolling --no-wait")) + Eventually(session).Should(Say("cf restage APP_NAME --strategy canary --no-wait")) Eventually(session).Should(Say("ALIAS:")) Eventually(session).Should(Say("rg")) Eventually(session).Should(Say("OPTIONS:")) - Eventually(session).Should(Say("--strategy Deployment strategy, either rolling or null")) + Eventually(session).Should(Say("--strategy Deployment strategy can be canary, rolling or null")) Eventually(session).Should(Say("--no-wait Exit when the first instance of the web process is healthy")) Eventually(session).Should(Say("ENVIRONMENT:")) Eventually(session).Should(Say(`CF_STAGING_TIMEOUT=15\s+Max wait time for staging, in minutes`)) @@ -230,6 +230,19 @@ applications: }) }) + When("strategy canary is given", func() { + It("restages successfully", func() { + userName, _ := helpers.GetCredentials() + session := helpers.CF("restage", appName, "--strategy", "canary") + Consistently(session.Err).ShouldNot(Say(`This action will cause app downtime\.`)) + Eventually(session).Should(Say(`Restaging app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) + Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) + Eventually(session).Should(Say(`Waiting for app to deploy\.\.\.`)) + Eventually(session).Should(Say("Canary deployment currently PAUSED.")) + Eventually(session).Should(Exit(0)) + }) + }) + When("isolation segments are available", func() { BeforeEach(func() { Eventually(helpers.CF("create-isolation-segment", RealIsolationSegment)).Should(Exit(0)) diff --git a/integration/v7/isolated/restart_command_test.go b/integration/v7/isolated/restart_command_test.go index 6467e581817..394c8f147bf 100644 --- a/integration/v7/isolated/restart_command_test.go +++ b/integration/v7/isolated/restart_command_test.go @@ -45,13 +45,13 @@ var _ = Describe("restart command", func() { Eventually(session).Should(Say(`restart - Stop all instances of the app, then start them again\.`)) Eventually(session).Should(Say("USAGE:")) Eventually(session).Should(Say("cf restart APP_NAME")) - Eventually(session).Should(Say("This command will cause downtime unless you use '--strategy rolling'.")) + Eventually(session).Should(Say("This command will cause downtime unless you use '--strategy")) Eventually(session).Should(Say("If the app's most recent package is unstaged, restarting the app will stage and run that package.")) Eventually(session).Should(Say("Otherwise, the app's current droplet will be run.")) Eventually(session).Should(Say("ALIAS:")) Eventually(session).Should(Say("rs")) Eventually(session).Should(Say("OPTIONS:")) - Eventually(session).Should(Say("--strategy Deployment strategy, either rolling or null")) + Eventually(session).Should(Say("--strategy Deployment strategy can be canary, rolling or null.")) Eventually(session).Should(Say("--no-wait Exit when the first instance of the web process is healthy")) Eventually(session).Should(Say("ENVIRONMENT:")) Eventually(session).Should(Say(`CF_STAGING_TIMEOUT=15\s+Max wait time for staging, in minutes`)) @@ -116,6 +116,28 @@ var _ = Describe("restart command", func() { }) }) + When("strategy canary is given", func() { + BeforeEach(func() { + helpers.WithHelloWorldApp(func(appDir string) { + Eventually(helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, "push", appName)).Should(Exit(0)) + }) + }) + It("creates a deploy", func() { + session := helpers.CF("restart", appName, "--strategy=canary") + Eventually(session).Should(Say(`Restarting app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) + Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) + Eventually(session).Should(Say(`Waiting for app to deploy\.\.\.`)) + Eventually(session).Should(Say(`name:\s+%s`, appName)) + Eventually(session).Should(Say(`requested state:\s+started`)) + Eventually(session).Should(Say(`routes:\s+%s.%s`, appName, helpers.DefaultSharedDomain())) + Eventually(session).Should(Say(`type:\s+web`)) + Eventually(session).Should(Say(`instances:\s+1/1`)) + Eventually(session).Should(Say(`memory usage:\s+\d+(M|G)`)) + Eventually(session).Should(Say(instanceStatsTitles)) + Eventually(session).Should(Say(instanceStatsValues)) + }) + }) + When("the app is running with no new packages", func() { BeforeEach(func() { helpers.WithHelloWorldApp(func(appDir string) { diff --git a/integration/v7/push/canary_push_test.go b/integration/v7/push/canary_push_test.go new file mode 100644 index 00000000000..4dd9a89adb7 --- /dev/null +++ b/integration/v7/push/canary_push_test.go @@ -0,0 +1,128 @@ +package push + +import ( + "fmt" + + "code.cloudfoundry.org/cli/integration/helpers" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + . "github.com/onsi/gomega/gbytes" + . "github.com/onsi/gomega/gexec" +) + +var _ = Describe("push with --strategy canary", func() { + var ( + appName string + userName string + ) + + BeforeEach(func() { + appName = helpers.PrefixedRandomName("app") + userName, _ = helpers.GetCredentials() + }) + + When("the app exists", func() { + BeforeEach(func() { + helpers.WithHelloWorldApp(func(appDir string) { + Eventually(helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, + PushCommandName, appName, + )).Should(Exit(0)) + }) + }) + + It("pushes the app and creates a new deployment", func() { + helpers.WithHelloWorldApp(func(appDir string) { + session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, + PushCommandName, appName, "--strategy", "canary", + ) + + Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Pushing app %s to org %s / space %s as %s\.\.\.`, appName, organization, space, userName)) + Expect(session).To(Say(`Packaging files to upload\.\.\.`)) + Expect(session).To(Say(`Uploading files\.\.\.`)) + Expect(session).To(Say(`100.00%`)) + Expect(session).To(Say(`Waiting for API to complete processing files\.\.\.`)) + Expect(session).To(Say(`Staging app and tracing logs\.\.\.`)) + Expect(session).To(Say(`Starting deployment for app %s\.\.\.`, appName)) + Expect(session).To(Say(`Waiting for app to deploy\.\.\.`)) + Expect(session).To(Say(`name:\s+%s`, appName)) + Expect(session).To(Say(`requested state:\s+started`)) + Expect(session).To(Say(`routes:\s+%s.%s`, appName, helpers.DefaultSharedDomain())) + Expect(session).To(Say(`type:\s+web`)) + Expect(session).To(Say(`start command:\s+%s`, helpers.StaticfileBuildpackStartCommand)) + Expect(session).To(Say(`#0\s+running`)) + Expect(session).To(Say(`Canary deployment currently PAUSED.`)) + }) + }) + }) + + When("canceling the deployment", func() { + BeforeEach(func() { + helpers.WithHelloWorldApp(func(appDir string) { + Eventually(helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, + PushCommandName, appName, + )).Should(Exit(0)) + }) + }) + + It("displays the deployment cancellation message", func() { + helpers.WithHelloWorldApp(func(appDir string) { + session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, + PushCommandName, appName, "--strategy", "canary", + ) + + Eventually(session).Should(Say(`Pushing app %s to org %s / space %s as %s\.\.\.`, appName, organization, space, userName)) + Eventually(session).Should(Say(`Packaging files to upload\.\.\.`)) + Eventually(session).Should(Say(`Uploading files\.\.\.`)) + Eventually(session).Should(Say(`100.00%`)) + Eventually(session).Should(Say(`Waiting for API to complete processing files\.\.\.`)) + Eventually(session).Should(Say(`Staging app and tracing logs\.\.\.`)) + Eventually(session).Should(Say(`Starting deployment for app %s\.\.\.`, appName)) + Eventually(session).Should(Say(`Waiting for app to deploy\.\.\.`)) + + Eventually(helpers.CF("cancel-deployment", appName)).Should(Exit(0)) + Eventually(session).Should(Say(`FAILED`)) + Eventually(session.Err).Should(Say(`Deployment has been canceled`)) + Eventually(session).Should(Exit(1)) + }) + }) + }) + + When("the app crashes", func() { + BeforeEach(func() { + helpers.WithHelloWorldApp(func(appDir string) { + Eventually(helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, + PushCommandName, appName, + )).Should(Exit(0)) + }) + }) + + It("times out", func() { + helpers.WithCrashingApp(func(appDir string) { + session := helpers.CustomCF(helpers.CFEnv{ + WorkingDirectory: appDir, + EnvVars: map[string]string{"CF_STARTUP_TIMEOUT": "0.1"}, + }, PushCommandName, appName, "--strategy", "canary") + Eventually(session).Should(Exit(1)) + Expect(session).To(Say(`Pushing app %s to org %s / space %s as %s\.\.\.`, appName, organization, space, userName)) + Expect(session).To(Say(`Packaging files to upload\.\.\.`)) + Expect(session).To(Say(`Uploading files\.\.\.`)) + Expect(session).To(Say(`100.00%`)) + Expect(session).To(Say(`Waiting for API to complete processing files\.\.\.`)) + Expect(session).To(Say(`Staging app and tracing logs\.\.\.`)) + Expect(session).To(Say(`Starting deployment for app %s\.\.\.`, appName)) + Expect(session).To(Say(`Waiting for app to deploy\.\.\.`)) + Expect(session).To(Say(`FAILED`)) + Expect(session.Err).To(Say(`Start app timeout`)) + Expect(session.Err).To(Say(`TIP: Application must be listening on the right port\. Instead of hard coding the port, use the \$PORT environment variable\.`)) + Expect(session.Err).To(Say(`Use 'cf logs %s --recent' for more information`, appName)) + appGUID := helpers.AppGUID(appName) + Eventually(func() *Buffer { + session_deployment := helpers.CF("curl", fmt.Sprintf("/v3/deployments?app_guids=%s", appGUID)) + Eventually(session_deployment).Should(Exit(0)) + return session_deployment.Out + }).Should(Say(`"reason":\s*"CANCELED"`)) + }) + }) + }) +}) diff --git a/resources/deployment_resource.go b/resources/deployment_resource.go index d4528794dfb..aa342468d15 100644 --- a/resources/deployment_resource.go +++ b/resources/deployment_resource.go @@ -32,9 +32,10 @@ func (d Deployment) MarshalJSON() ([]byte, error) { } var ccDeployment struct { - Droplet *Droplet `json:"droplet,omitempty"` - Revision *Revision `json:"revision,omitempty"` - Relationships Relationships `json:"relationships,omitempty"` + Droplet *Droplet `json:"droplet,omitempty"` + Revision *Revision `json:"revision,omitempty"` + Strategy constant.DeploymentStrategy `json:"strategy,omitempty"` + Relationships Relationships `json:"relationships,omitempty"` } if d.DropletGUID != "" { @@ -45,6 +46,10 @@ func (d Deployment) MarshalJSON() ([]byte, error) { ccDeployment.Revision = &Revision{d.RevisionGUID} } + if d.Strategy != "" { + ccDeployment.Strategy = d.Strategy + } + ccDeployment.Relationships = d.Relationships return json.Marshal(ccDeployment) From edf2552141a869889941b4692fcb2ccd1556c650 Mon Sep 17 00:00:00 2001 From: Shwetha Gururaj Date: Thu, 8 Aug 2024 13:23:22 -0400 Subject: [PATCH 04/33] Canary rollback command changes (#3089) --- command/v7/rollback_command.go | 15 ++++++++----- command/v7/rollback_command_test.go | 21 +++++++++++++++++++ .../v7/isolated/rollback_command_test.go | 21 +++++++++++++++++-- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/command/v7/rollback_command.go b/command/v7/rollback_command.go index f01205837f6..84119377363 100644 --- a/command/v7/rollback_command.go +++ b/command/v7/rollback_command.go @@ -14,11 +14,12 @@ import ( type RollbackCommand struct { BaseCommand - Force bool `short:"f" description:"Force rollback without confirmation"` - RequiredArgs flag.AppName `positional-args:"yes"` - Version flag.Revision `long:"version" required:"true" description:"Roll back to the specified revision"` - relatedCommands interface{} `related_commands:"revisions"` - usage interface{} `usage:"CF_NAME rollback APP_NAME [--version VERSION] [-f]"` + Force bool `short:"f" description:"Force rollback without confirmation"` + RequiredArgs flag.AppName `positional-args:"yes"` + Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy can be canary or rolling. When not specified, it defaults to rolling."` + Version flag.Revision `long:"version" required:"true" description:"Roll back to the specified revision"` + relatedCommands interface{} `related_commands:"revisions"` + usage interface{} `usage:"CF_NAME rollback APP_NAME [--version VERSION] [-f]"` LogCacheClient sharedaction.LogCacheClient Stager shared.AppStager @@ -112,6 +113,10 @@ func (cmd RollbackCommand) Execute(args []string) error { AppAction: constant.ApplicationRollingBack, } + if cmd.Strategy.Name != "" { + opts.Strategy = cmd.Strategy.Name + } + startAppErr := cmd.Stager.StartApp(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), revision.GUID, opts) if startAppErr != nil { return startAppErr diff --git a/command/v7/rollback_command_test.go b/command/v7/rollback_command_test.go index 59f1a6bec36..6f80f7ca15f 100644 --- a/command/v7/rollback_command_test.go +++ b/command/v7/rollback_command_test.go @@ -219,6 +219,7 @@ var _ = Describe("rollback Command", func() { Expect(application.GUID).To(Equal("123")) Expect(revisionGUID).To(Equal("some-1-guid")) Expect(opts.AppAction).To(Equal(constant.ApplicationRollingBack)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyRolling)) Expect(testUI.Out).To(Say("Rolling '%s' back to revision '1' will create a new revision. The new revision will use the settings from revision '1'.", app)) Expect(testUI.Out).To(Say("Are you sure you want to continue?")) @@ -232,6 +233,25 @@ var _ = Describe("rollback Command", func() { }) }) + When("the strategy flag is passed", func() { + BeforeEach(func() { + cmd.Strategy.Name = constant.DeploymentStrategyCanary + + _, err := input.Write([]byte("y\n")) + Expect(err).NotTo(HaveOccurred()) + }) + It("uses the specified strategy to rollback", func() { + Expect(fakeAppStager.StartAppCallCount()).To(Equal(1), "GetStartApp call count") + + application, _, _, revisionGUID, opts := fakeAppStager.StartAppArgsForCall(0) + Expect(executeErr).NotTo(HaveOccurred()) + Expect(application.GUID).To(Equal("123")) + Expect(revisionGUID).To(Equal("some-1-guid")) + Expect(opts.AppAction).To(Equal(constant.ApplicationRollingBack)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyCanary)) + }) + }) + When("user says no to prompt", func() { BeforeEach(func() { _, err := input.Write([]byte("n\n")) @@ -265,4 +285,5 @@ var _ = Describe("rollback Command", func() { }) }) }) + }) diff --git a/integration/v7/isolated/rollback_command_test.go b/integration/v7/isolated/rollback_command_test.go index 7410f4d2b42..75c12d6f621 100644 --- a/integration/v7/isolated/rollback_command_test.go +++ b/integration/v7/isolated/rollback_command_test.go @@ -34,8 +34,9 @@ var _ = Describe("rollback command", func() { Expect(session).To(Say("USAGE:")) Expect(session).To(Say(`cf rollback APP_NAME \[--version VERSION\]`)) Expect(session).To(Say("OPTIONS:")) - Expect(session).To(Say("-f Force rollback without confirmation")) - Expect(session).To(Say("--version Roll back to the specified revision")) + Expect(session).To(Say("-f Force rollback without confirmation")) + Expect(session).To(Say("--strategy Deployment strategy can be canary or rolling. When not specified, it defaults to rolling.")) + Expect(session).To(Say("--version Roll back to the specified revision")) Expect(session).To(Say("SEE ALSO:")) Expect(session).To(Say("revisions")) }) @@ -148,6 +149,22 @@ applications: Expect(session).To(Say(`3\(deployed\)\s+New droplet deployed.`)) }) + + When("the strategy flag is provided", func() { + BeforeEach(func() { + _, err := buffer.Write([]byte("y\n")) + Expect(err).ToNot(HaveOccurred()) + }) + + It("uses the given strategy to rollback", func() { + session := helpers.CFWithStdin(buffer, "rollback", appName, "--version", "1", "--strategy", "canary") + Eventually(session).Should(Exit(0)) + + Expect(session).To(HaveRollbackPrompt()) + Expect(session).To(HaveRollbackOutput(appName, orgName, spaceName, userName)) + Expect(session).To(Say("OK")) + }) + }) }) When("the user enters n", func() { From 20c6780385c2df0a7fe4ef3c972f9fb94c34fafa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 18:54:50 -0700 Subject: [PATCH 05/33] Bump golang.org/x/crypto from 0.25.0 to 0.26.0 (#3082) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.25.0 to 0.26.0. - [Commits](https://github.com/golang/crypto/compare/v0.25.0...v0.26.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 84df77d2ed8..ba2ff54ea72 100644 --- a/go.mod +++ b/go.mod @@ -39,10 +39,10 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/tedsuo/rata v1.0.1-0.20170830210128-07d200713958 github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec - golang.org/x/crypto v0.25.0 + golang.org/x/crypto v0.26.0 golang.org/x/net v0.27.0 - golang.org/x/term v0.22.0 - golang.org/x/text v0.16.0 + golang.org/x/term v0.23.0 + golang.org/x/text v0.17.0 gopkg.in/cheggaaa/pb.v1 v1.0.28 gopkg.in/yaml.v2 v2.4.0 k8s.io/apimachinery v0.30.3 @@ -80,8 +80,8 @@ require ( golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/mod v0.19.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.22.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.23.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.23.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/go.sum b/go.sum index d25c7ddb35d..d98b1912c25 100644 --- a/go.sum +++ b/go.sum @@ -259,8 +259,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= @@ -297,8 +297,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180419222023-a2a45943ae67/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -325,20 +325,20 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From f0585b174d991ce7011ca3b45c0d149535c9a0fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 14:26:51 -0700 Subject: [PATCH 06/33] Bump github.com/onsi/ginkgo/v2 from 2.19.1 to 2.20.0 (#3094) Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.19.1 to 2.20.0. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.19.1...v2.20.0) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index ba2ff54ea72..19e5b02d3c1 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 github.com/moby/term v0.5.0 github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d - github.com/onsi/ginkgo/v2 v2.19.1 + github.com/onsi/ginkgo/v2 v2.20.0 github.com/onsi/gomega v1.34.1 github.com/pkg/errors v0.9.1 github.com/sabhiram/go-gitignore v0.0.0-20171017070213-362f9845770f @@ -40,7 +40,7 @@ require ( github.com/tedsuo/rata v1.0.1-0.20170830210128-07d200713958 github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec golang.org/x/crypto v0.26.0 - golang.org/x/net v0.27.0 + golang.org/x/net v0.28.0 golang.org/x/term v0.23.0 golang.org/x/text v0.17.0 gopkg.in/cheggaaa/pb.v1 v1.0.28 @@ -65,7 +65,7 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0 // indirect + github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/imdario/mergo v0.3.6 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -78,12 +78,12 @@ require ( github.com/rivo/uniseg v0.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/mod v0.19.0 // indirect + golang.org/x/mod v0.20.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.23.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.23.0 // indirect + golang.org/x/tools v0.24.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect diff --git a/go.sum b/go.sum index d98b1912c25..dc9e5c02f7c 100644 --- a/go.sum +++ b/go.sum @@ -121,8 +121,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0 h1:e+8XbKB6IMn8A4OAyZccO4pYfB3s7bt6azNIPE7AnPg= -github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -194,8 +194,8 @@ github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/ginkgo/v2 v2.19.1 h1:QXgq3Z8Crl5EL1WBAC98A5sEBHARrAJNzAmMxzLcRF0= -github.com/onsi/ginkgo/v2 v2.19.1/go.mod h1:O3DtEWQkPa/F7fBMgmZQKKsluAy8pd3rEQdrjkPb9zA= +github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw= +github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= github.com/onsi/gomega v0.0.0-20171105031654-1eecca0ba8e6/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -269,8 +269,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= -golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180418062111-d41e8174641f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -287,8 +287,8 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -351,8 +351,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.11-0.20220316014157-77aa08bb151a/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= -golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 69f68e5207c4fd22a1ccdf0fe588d471e5b9c2e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 12 Aug 2024 15:02:09 -0500 Subject: [PATCH 07/33] Max in flight flag (#3085) (#3096) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Allow the user to set max-in-flight while pushing app * Add max-in-flight flag to the restart command * Add max-in-flight flag to restage command * Add max-in-flight flag to rollback command * Add max-in-flight flag to copy-src command * Remove `--no-wait` to ensure no flakes --------- Signed-off-by: João Pereira --- actor/v7pushaction/actor.go | 2 +- actor/v7pushaction/actor_test.go | 2 +- .../create_deployment_for_push_plan.go | 14 ++- .../create_deployment_for_push_plan_test.go | 46 +++++++ actor/v7pushaction/push_plan.go | 2 + ...up_deployment_information_for_push_plan.go | 13 ++ ...loyment_information_for_push_plan_test.go} | 27 ++++- ...setup_deployment_strategy_for_push_plan.go | 7 -- .../convert_to_translatable_error.go | 7 ++ command/v7/copy_source_command.go | 18 ++- command/v7/copy_source_command_test.go | 114 +++++++++++------- command/v7/push_command.go | 7 ++ command/v7/push_command_test.go | 23 ++++ command/v7/restage_command.go | 26 +++- command/v7/restage_command_test.go | 41 ++++++- command/v7/restart_command.go | 23 ++++ command/v7/restart_command_test.go | 32 +++++ command/v7/rollback_command.go | 27 ++++- command/v7/rollback_command_test.go | 24 ++++ command/v7/shared/app_stager.go | 9 +- command/v7/shared/app_stager_test.go | 38 ++++-- .../v7/isolated/continue_deployment_test.go | 2 +- .../v7/isolated/copy_source_command_test.go | 1 + .../v7/isolated/restage_command_test.go | 7 +- .../v7/isolated/restart_command_test.go | 7 +- .../v7/isolated/rollback_command_test.go | 9 +- integration/v7/push/help_test.go | 1 + integration/v7/push/rolling_push_test.go | 24 ++++ resources/deployment_resource.go | 16 +++ 29 files changed, 471 insertions(+), 98 deletions(-) create mode 100644 actor/v7pushaction/setup_deployment_information_for_push_plan.go rename actor/v7pushaction/{setup_deployment_strategy_for_push_plan_test.go => setup_deployment_information_for_push_plan_test.go} (55%) delete mode 100644 actor/v7pushaction/setup_deployment_strategy_for_push_plan.go diff --git a/actor/v7pushaction/actor.go b/actor/v7pushaction/actor.go index f2c74ef9cea..829b64e2a19 100644 --- a/actor/v7pushaction/actor.go +++ b/actor/v7pushaction/actor.go @@ -71,7 +71,7 @@ func NewActor(v3Actor V7Actor, sharedActor SharedActor) *Actor { SetDefaultBitsPathForPushPlan, SetupDropletPathForPushPlan, actor.SetupAllResourcesForPushPlan, - SetupDeploymentStrategyForPushPlan, + SetupDeploymentInformationForPushPlan, SetupNoStartForPushPlan, SetupNoWaitForPushPlan, SetupTaskAppForPushPlan, diff --git a/actor/v7pushaction/actor_test.go b/actor/v7pushaction/actor_test.go index d3ebc799729..32f314564a4 100644 --- a/actor/v7pushaction/actor_test.go +++ b/actor/v7pushaction/actor_test.go @@ -22,7 +22,7 @@ var _ = Describe("Actor", func() { SetDefaultBitsPathForPushPlan, SetupDropletPathForPushPlan, actor.SetupAllResourcesForPushPlan, - SetupDeploymentStrategyForPushPlan, + SetupDeploymentInformationForPushPlan, SetupNoStartForPushPlan, SetupNoWaitForPushPlan, SetupTaskAppForPushPlan, diff --git a/actor/v7pushaction/create_deployment_for_push_plan.go b/actor/v7pushaction/create_deployment_for_push_plan.go index 241568f8141..5b23178c3a5 100644 --- a/actor/v7pushaction/create_deployment_for_push_plan.go +++ b/actor/v7pushaction/create_deployment_for_push_plan.go @@ -8,10 +8,16 @@ import ( func (actor Actor) CreateDeploymentForApplication(pushPlan PushPlan, eventStream chan<- *PushEvent, progressBar ProgressBar) (PushPlan, Warnings, error) { eventStream <- &PushEvent{Plan: pushPlan, Event: StartingDeployment} - var dep resources.Deployment - dep.DropletGUID = pushPlan.DropletGUID - dep.Strategy = pushPlan.Strategy - dep.Relationships = resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: pushPlan.Application.GUID}} + dep := resources.Deployment{ + Strategy: pushPlan.Strategy, + DropletGUID: pushPlan.DropletGUID, + Relationships: resources.Relationships{constant.RelationshipTypeApplication: resources.Relationship{GUID: pushPlan.Application.GUID}}, + } + + if pushPlan.MaxInFlight != 0 { + dep.Options = resources.DeploymentOpts{MaxInFlight: pushPlan.MaxInFlight} + } + deploymentGUID, warnings, err := actor.V7Actor.CreateDeployment(dep) if err != nil { diff --git a/actor/v7pushaction/create_deployment_for_push_plan_test.go b/actor/v7pushaction/create_deployment_for_push_plan_test.go index 9bbcfa30578..46031d80dc8 100644 --- a/actor/v7pushaction/create_deployment_for_push_plan_test.go +++ b/actor/v7pushaction/create_deployment_for_push_plan_test.go @@ -6,6 +6,7 @@ import ( "code.cloudfoundry.org/cli/actor/v7action" . "code.cloudfoundry.org/cli/actor/v7pushaction" "code.cloudfoundry.org/cli/actor/v7pushaction/v7pushactionfakes" + "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" "code.cloudfoundry.org/cli/resources" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -106,6 +107,51 @@ var _ = Describe("CreateDeploymentForApplication()", func() { Expect(events).To(ConsistOf(StartingDeployment)) }) }) + + When("strategy is provided", func() { + BeforeEach(func() { + fakeV7Actor.PollStartForDeploymentCalls(func(_ resources.Application, _ string, _ bool, handleInstanceDetails func(string)) (warnings v7action.Warnings, err error) { + handleInstanceDetails("Instances starting...") + return nil, nil + }) + + fakeV7Actor.CreateDeploymentReturns( + "some-deployment-guid", + v7action.Warnings{"some-deployment-warning"}, + nil, + ) + paramPlan.Strategy = "rolling" + paramPlan.MaxInFlight = 10 + }) + + It("waits for the app to start", func() { + Expect(fakeV7Actor.PollStartForDeploymentCallCount()).To(Equal(1)) + givenApp, givenDeploymentGUID, noWait, _ := fakeV7Actor.PollStartForDeploymentArgsForCall(0) + Expect(givenApp).To(Equal(resources.Application{GUID: "some-app-guid"})) + Expect(givenDeploymentGUID).To(Equal("some-deployment-guid")) + Expect(noWait).To(Equal(false)) + Expect(events).To(ConsistOf(StartingDeployment, InstanceDetails, WaitingForDeployment)) + Expect(fakeV7Actor.CreateDeploymentCallCount()).To(Equal(1)) + dep := fakeV7Actor.CreateDeploymentArgsForCall(0) + Expect(dep).To(Equal(resources.Deployment{ + Strategy: "rolling", + Options: resources.DeploymentOpts{MaxInFlight: 10}, + Relationships: resources.Relationships{ + constant.RelationshipTypeApplication: resources.Relationship{GUID: "some-app-guid"}, + }, + })) + }) + + It("returns errors and warnings", func() { + Expect(returnedPushPlan).To(Equal(paramPlan)) + Expect(executeErr).NotTo(HaveOccurred()) + Expect(warnings).To(ConsistOf("some-deployment-warning")) + }) + + It("records deployment events", func() { + Expect(events).To(ConsistOf(StartingDeployment, InstanceDetails, WaitingForDeployment)) + }) + }) }) Describe("waiting for app to start", func() { diff --git a/actor/v7pushaction/push_plan.go b/actor/v7pushaction/push_plan.go index eacb52d577a..876a8ec2259 100644 --- a/actor/v7pushaction/push_plan.go +++ b/actor/v7pushaction/push_plan.go @@ -20,6 +20,7 @@ type PushPlan struct { NoStart bool NoWait bool Strategy constant.DeploymentStrategy + MaxInFlight int TaskTypeApplication bool DockerImageCredentials v7action.DockerImageCredentials @@ -47,6 +48,7 @@ type FlagOverrides struct { HealthCheckType constant.HealthCheckType Instances types.NullInt Memory string + MaxInFlight *int NoStart bool NoWait bool ProvidedAppPath string diff --git a/actor/v7pushaction/setup_deployment_information_for_push_plan.go b/actor/v7pushaction/setup_deployment_information_for_push_plan.go new file mode 100644 index 00000000000..11e4dd26d8e --- /dev/null +++ b/actor/v7pushaction/setup_deployment_information_for_push_plan.go @@ -0,0 +1,13 @@ +package v7pushaction + +import "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" + +func SetupDeploymentInformationForPushPlan(pushPlan PushPlan, overrides FlagOverrides) (PushPlan, error) { + pushPlan.Strategy = overrides.Strategy + + if overrides.Strategy != constant.DeploymentStrategyDefault && overrides.MaxInFlight != nil { + pushPlan.MaxInFlight = *overrides.MaxInFlight + } + + return pushPlan, nil +} diff --git a/actor/v7pushaction/setup_deployment_strategy_for_push_plan_test.go b/actor/v7pushaction/setup_deployment_information_for_push_plan_test.go similarity index 55% rename from actor/v7pushaction/setup_deployment_strategy_for_push_plan_test.go rename to actor/v7pushaction/setup_deployment_information_for_push_plan_test.go index 5d0d8df0aba..14515c9f446 100644 --- a/actor/v7pushaction/setup_deployment_strategy_for_push_plan_test.go +++ b/actor/v7pushaction/setup_deployment_information_for_push_plan_test.go @@ -9,7 +9,7 @@ import ( . "github.com/onsi/gomega" ) -var _ = Describe("SetupDeploymentStrategyForPushPlan", func() { +var _ = Describe("SetupDeploymentInformationForPushPlan", func() { var ( pushPlan PushPlan overrides FlagOverrides @@ -24,24 +24,47 @@ var _ = Describe("SetupDeploymentStrategyForPushPlan", func() { }) JustBeforeEach(func() { - expectedPushPlan, executeErr = SetupDeploymentStrategyForPushPlan(pushPlan, overrides) + expectedPushPlan, executeErr = SetupDeploymentInformationForPushPlan(pushPlan, overrides) }) When("flag overrides specifies strategy", func() { BeforeEach(func() { overrides.Strategy = "rolling" + maxInFlight := 5 + overrides.MaxInFlight = &maxInFlight }) It("sets the strategy on the push plan", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(expectedPushPlan.Strategy).To(Equal(constant.DeploymentStrategyRolling)) }) + + It("sets the max in flight on the push plan", func() { + Expect(executeErr).ToNot(HaveOccurred()) + Expect(expectedPushPlan.MaxInFlight).To(Equal(5)) + }) }) When("flag overrides does not specify strategy", func() { + BeforeEach(func() { + maxInFlight := 10 + overrides.MaxInFlight = &maxInFlight + }) It("leaves the strategy as its default value on the push plan", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(expectedPushPlan.Strategy).To(Equal(constant.DeploymentStrategyDefault)) }) + + It("does not set MaxInFlight", func() { + Expect(executeErr).ToNot(HaveOccurred()) + Expect(expectedPushPlan.MaxInFlight).To(Equal(0)) + }) + }) + + When("flag not provided", func() { + It("does not set MaxInFlight", func() { + Expect(executeErr).ToNot(HaveOccurred()) + Expect(expectedPushPlan.MaxInFlight).To(Equal(0)) + }) }) }) diff --git a/actor/v7pushaction/setup_deployment_strategy_for_push_plan.go b/actor/v7pushaction/setup_deployment_strategy_for_push_plan.go deleted file mode 100644 index 0e6c2526342..00000000000 --- a/actor/v7pushaction/setup_deployment_strategy_for_push_plan.go +++ /dev/null @@ -1,7 +0,0 @@ -package v7pushaction - -func SetupDeploymentStrategyForPushPlan(pushPlan PushPlan, overrides FlagOverrides) (PushPlan, error) { - pushPlan.Strategy = overrides.Strategy - - return pushPlan, nil -} diff --git a/command/translatableerror/convert_to_translatable_error.go b/command/translatableerror/convert_to_translatable_error.go index 4bcacac1e35..f8636a7c5ec 100644 --- a/command/translatableerror/convert_to_translatable_error.go +++ b/command/translatableerror/convert_to_translatable_error.go @@ -188,6 +188,13 @@ func ConvertToTranslatableError(err error) error { return RunTaskError{Message: "App is not staged."} } + if strings.Contains(e.Message, "Unknown field(s): 'options'") { + return MinimumCFAPIVersionNotMetError{ + Command: "'--max-in-flight' flag", + MinimumVersion: "3.173.0", + } + } + // JSON Errors case *json.SyntaxError: return JSONSyntaxError{Err: e} diff --git a/command/v7/copy_source_command.go b/command/v7/copy_source_command.go index 9d18a329d83..c4ae96eeef1 100644 --- a/command/v7/copy_source_command.go +++ b/command/v7/copy_source_command.go @@ -17,6 +17,7 @@ type CopySourceCommand struct { RequiredArgs flag.CopySourceArgs `positional-args:"yes"` usage interface{} `usage:"CF_NAME copy-source SOURCE_APP DESTINATION_APP [-s TARGET_SPACE [-o TARGET_ORG]] [--no-restart] [--strategy STRATEGY] [--no-wait]"` Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy can be canary, rolling or null"` + MaxInFlight *int `long:"max-in-flight" description:"Defines the maximum number of instances that will be actively being started. Only applies when --strategy flag is specified."` NoWait bool `long:"no-wait" description:"Exit when the first instance of the web process is healthy"` NoRestart bool `long:"no-restart" description:"Do not restage the destination application"` Organization string `short:"o" long:"organization" description:"Org that contains the destination application"` @@ -48,6 +49,14 @@ func (cmd *CopySourceCommand) ValidateFlags() error { } } + if cmd.Strategy.Name == constant.DeploymentStrategyDefault && cmd.MaxInFlight != nil { + return translatableerror.RequiredFlagsError{Arg1: "--max-in-flight", Arg2: "--strategy"} + } + + if cmd.Strategy.Name != constant.DeploymentStrategyDefault && cmd.MaxInFlight != nil && *cmd.MaxInFlight < 1 { + return translatableerror.IncorrectUsageError{Message: "--max-in-flight must be greater than or equal to 1"} + } + return nil } @@ -160,10 +169,15 @@ func (cmd CopySourceCommand) Execute(args []string) error { cmd.UI.DisplayNewline() opts := shared.AppStartOpts{ - Strategy: cmd.Strategy.Name, - NoWait: cmd.NoWait, AppAction: constant.ApplicationRestarting, + NoWait: cmd.NoWait, + Strategy: cmd.Strategy.Name, } + + if cmd.MaxInFlight != nil { + opts.MaxInFlight = *cmd.MaxInFlight + } + err = cmd.Stager.StageAndStart(targetApp, targetSpace, targetOrg, pkg.GUID, opts) if err != nil { return mapErr(cmd.Config, targetApp.Name, err) diff --git a/command/v7/copy_source_command_test.go b/command/v7/copy_source_command_test.go index 2afadbdb1b0..9d3787dc6ff 100644 --- a/command/v7/copy_source_command_test.go +++ b/command/v7/copy_source_command_test.go @@ -125,49 +125,6 @@ var _ = Describe("copy-source Command", func() { }) }) - When("the target organization is specified but the targeted space isn't", func() { - BeforeEach(func() { - cmd.Organization = "some-other-organization" - }) - - It("returns an error", func() { - Expect(executeErr).To(MatchError(translatableerror.RequiredFlagsError{ - Arg1: "--organization, -o", - Arg2: "--space, -s", - })) - }) - }) - - When("the no restart and strategy flags are both provided", func() { - BeforeEach(func() { - cmd.NoRestart = true - cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyRolling} - }) - - It("returns an error", func() { - Expect(executeErr).To(MatchError(translatableerror.ArgumentCombinationError{ - Args: []string{ - "--no-restart", "--strategy", - }, - })) - }) - }) - - When("the no restart and no wait flags are both provided", func() { - BeforeEach(func() { - cmd.NoRestart = true - cmd.NoWait = true - }) - - It("returns an error", func() { - Expect(executeErr).To(MatchError(translatableerror.ArgumentCombinationError{ - Args: []string{ - "--no-restart", "--no-wait", - }, - })) - }) - }) - When("a target org and space is provided", func() { BeforeEach(func() { cmd.Organization = "destination-org" @@ -329,6 +286,8 @@ var _ = Describe("copy-source Command", func() { cmd.Strategy = flag.DeploymentStrategy{ Name: constant.DeploymentStrategyRolling, } + maxInFlight := 5 + cmd.MaxInFlight = &maxInFlight }) It("stages and starts the app with the appropriate strategy", func() { @@ -338,9 +297,10 @@ var _ = Describe("copy-source Command", func() { Expect(spaceForApp).To(Equal(configv3.Space{Name: "some-space", GUID: "some-space-guid"})) Expect(orgForApp).To(Equal(configv3.Organization{Name: "some-org"})) Expect(pkgGUID).To(Equal("target-package-guid")) - Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyRolling)) - Expect(opts.NoWait).To(Equal(false)) Expect(opts.AppAction).To(Equal(constant.ApplicationRestarting)) + Expect(opts.MaxInFlight).To(Equal(5)) + Expect(opts.NoWait).To(Equal(false)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyRolling)) }) }) @@ -349,6 +309,8 @@ var _ = Describe("copy-source Command", func() { cmd.Strategy = flag.DeploymentStrategy{ Name: constant.DeploymentStrategyCanary, } + maxInFlight := 1 + cmd.MaxInFlight = &maxInFlight }) It("stages and starts the app with the appropriate strategy", func() { @@ -417,4 +379,66 @@ var _ = Describe("copy-source Command", func() { It("succeeds", func() { Expect(executeErr).To(Not(HaveOccurred())) }) + + DescribeTable("ValidateFlags returns an error", + func(setup func(), expectedErr error) { + setup() + err := cmd.ValidateFlags() + if expectedErr == nil { + Expect(err).To(BeNil()) + } else { + Expect(err).To(MatchError(expectedErr)) + } + }, + Entry("the target organization is specified but the targeted space isn't", + func() { + cmd.Organization = "some-other-organization" + }, + translatableerror.RequiredFlagsError{ + Arg1: "--organization, -o", + Arg2: "--space, -s", + }), + + Entry("the no restart and strategy flags are both provided", + func() { + cmd.NoRestart = true + cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyRolling} + }, + translatableerror.ArgumentCombinationError{ + Args: []string{ + "--no-restart", "--strategy", + }, + }), + + Entry("the no restart and no wait flags are both provided", + func() { + cmd.NoRestart = true + cmd.NoWait = true + }, + translatableerror.ArgumentCombinationError{ + Args: []string{ + "--no-restart", "--no-wait", + }, + }), + + Entry("max-in-flight is passed without strategy", + func() { + maxInFlight := 5 + cmd.MaxInFlight = &maxInFlight + }, + translatableerror.RequiredFlagsError{ + Arg1: "--max-in-flight", + Arg2: "--strategy", + }), + + Entry("max-in-flight is smaller than 1", + func() { + cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyRolling} + maxInFlight := 0 + cmd.MaxInFlight = &maxInFlight + }, + translatableerror.IncorrectUsageError{ + Message: "--max-in-flight must be greater than or equal to 1", + }), + ) }) diff --git a/command/v7/push_command.go b/command/v7/push_command.go index 12e0001b15e..cbf71d78e78 100644 --- a/command/v7/push_command.go +++ b/command/v7/push_command.go @@ -90,6 +90,7 @@ type PushCommand struct { Instances flag.Instances `long:"instances" short:"i" description:"Number of instances"` LogRateLimit string `long:"log-rate-limit" short:"l" description:"Log rate limit per second, in bytes (e.g. 128B, 4K, 1M). -l=-1 represents unlimited"` PathToManifest flag.ManifestPathWithExistenceCheck `long:"manifest" short:"f" description:"Path to manifest"` + MaxInFlight *int `long:"max-in-flight" description:"Defines the maximum number of instances that will be actively being started. Only applies when --strategy flag is specified."` Memory string `long:"memory" short:"m" description:"Memory limit (e.g. 256M, 1024M, 1G)"` NoManifest bool `long:"no-manifest" description:"Ignore manifest file"` NoRoute bool `long:"no-route" description:"Do not map a route to this app"` @@ -347,6 +348,7 @@ func (cmd PushCommand) GetFlagOverrides() (v7pushaction.FlagOverrides, error) { HealthCheckType: cmd.HealthCheckType.Type, HealthCheckTimeout: cmd.HealthCheckTimeout.Value, Instances: cmd.Instances.NullInt, + MaxInFlight: cmd.MaxInFlight, Memory: cmd.Memory, NoStart: cmd.NoStart, NoWait: cmd.NoWait, @@ -485,6 +487,11 @@ func (cmd PushCommand) ValidateFlags() error { } case !cmd.validBuildpacks(): return translatableerror.InvalidBuildpacksError{} + + case cmd.Strategy.Name == constant.DeploymentStrategyDefault && cmd.MaxInFlight != nil: + return translatableerror.RequiredFlagsError{Arg1: "--max-in-flight", Arg2: "--strategy"} + case cmd.Strategy.Name != constant.DeploymentStrategyDefault && cmd.MaxInFlight != nil && *cmd.MaxInFlight < 1: + return translatableerror.IncorrectUsageError{Message: "--max-in-flight must be greater than or equal to 1"} } return nil diff --git a/command/v7/push_command_test.go b/command/v7/push_command_test.go index 00a464644cc..ead21520928 100644 --- a/command/v7/push_command_test.go +++ b/command/v7/push_command_test.go @@ -1072,6 +1072,8 @@ var _ = Describe("push Command", func() { cmd.RandomRoute = false cmd.NoStart = true cmd.NoWait = true + maxInFlight := 1 + cmd.MaxInFlight = &maxInFlight cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyRolling} cmd.Instances = flag.Instances{NullInt: types.NullInt{Value: 10, IsSet: true}} cmd.PathToManifest = "/manifest/path" @@ -1108,6 +1110,7 @@ var _ = Describe("push Command", func() { Expect(overrides.Vars).To(Equal([]template.VarKV{{Name: "key", Value: "val"}})) Expect(overrides.Task).To(BeTrue()) Expect(overrides.LogRateLimit).To(Equal("512M")) + Expect(*overrides.MaxInFlight).To(Equal(1)) }) When("a docker image is provided", func() { @@ -1290,5 +1293,25 @@ var _ = Describe("push Command", func() { "--task", "--strategy=canary", }, }), + + Entry("max-in-flight is passed without strategy", + func() { + maxInFlight := 10 + cmd.MaxInFlight = &maxInFlight + }, + translatableerror.RequiredFlagsError{ + Arg1: "--max-in-flight", + Arg2: "--strategy", + }), + + Entry("max-in-flight is smaller than 1", + func() { + cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyRolling} + maxInFlight := 0 + cmd.MaxInFlight = &maxInFlight + }, + translatableerror.IncorrectUsageError{ + Message: "--max-in-flight must be greater than or equal to 1", + }), ) }) diff --git a/command/v7/restage_command.go b/command/v7/restage_command.go index 76b02c618bd..6fa503b2d81 100644 --- a/command/v7/restage_command.go +++ b/command/v7/restage_command.go @@ -16,6 +16,7 @@ type RestageCommand struct { RequiredArgs flag.AppName `positional-args:"yes"` Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy can be canary, rolling or null."` + MaxInFlight *int `long:"max-in-flight" description:"Defines the maximum number of instances that will be actively being restaged. Only applies when --strategy flag is specified."` NoWait bool `long:"no-wait" description:"Exit when the first instance of the web process is healthy"` usage interface{} `usage:"CF_NAME restage APP_NAME\n\n This command will cause downtime unless you use '--strategy' flag.\n\nEXAMPLES:\n CF_NAME restage APP_NAME\n CF_NAME restage APP_NAME --strategy rolling\n CF_NAME restage APP_NAME --strategy canary --no-wait"` relatedCommands interface{} `related_commands:"restart"` @@ -52,6 +53,11 @@ func (cmd RestageCommand) Execute(args []string) error { return err } + err = cmd.ValidateFlags() + if err != nil { + return err + } + if len(cmd.Strategy.Name) <= 0 { cmd.UI.DisplayWarning("This action will cause app downtime.") } @@ -78,10 +84,15 @@ func (cmd RestageCommand) Execute(args []string) error { } opts := shared.AppStartOpts{ - Strategy: cmd.Strategy.Name, - NoWait: cmd.NoWait, AppAction: constant.ApplicationRestarting, + NoWait: cmd.NoWait, + Strategy: cmd.Strategy.Name, } + + if cmd.MaxInFlight != nil { + opts.MaxInFlight = *cmd.MaxInFlight + } + err = cmd.Stager.StageAndStart(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), pkg.GUID, opts) if err != nil { return mapErr(cmd.Config, cmd.RequiredArgs.AppName, err) @@ -90,6 +101,17 @@ func (cmd RestageCommand) Execute(args []string) error { return nil } +func (cmd RestageCommand) ValidateFlags() error { + switch { + case cmd.Strategy.Name == constant.DeploymentStrategyDefault && cmd.MaxInFlight != nil: + return translatableerror.RequiredFlagsError{Arg1: "--max-in-flight", Arg2: "--strategy"} + case cmd.Strategy.Name != constant.DeploymentStrategyDefault && cmd.MaxInFlight != nil && *cmd.MaxInFlight < 1: + return translatableerror.IncorrectUsageError{Message: "--max-in-flight must be greater than or equal to 1"} + } + + return nil +} + func mapErr(config command.Config, appName string, err error) error { switch err.(type) { case actionerror.AllInstancesCrashedError: diff --git a/command/v7/restage_command_test.go b/command/v7/restage_command_test.go index 652e7740d84..8cddad4ca5e 100644 --- a/command/v7/restage_command_test.go +++ b/command/v7/restage_command_test.go @@ -8,6 +8,7 @@ import ( "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" "code.cloudfoundry.org/cli/command/commandfakes" "code.cloudfoundry.org/cli/command/flag" + "code.cloudfoundry.org/cli/command/translatableerror" v7 "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/command/v7/shared/sharedfakes" "code.cloudfoundry.org/cli/command/v7/v7fakes" @@ -73,6 +74,10 @@ var _ = Describe("restage Command", func() { v7action.Warnings{"get-package-warning"}, nil, ) + + cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyRolling} + maxInFlight := 4 + cmd.MaxInFlight = &maxInFlight }) JustBeforeEach(func() { @@ -108,6 +113,7 @@ var _ = Describe("restage Command", func() { When("No strategy flag is given", func() { BeforeEach(func() { cmd.Strategy.Name = constant.DeploymentStrategyDefault + cmd.MaxInFlight = nil }) It("warns that there will be app downtime", func() { Expect(testUI.Err).To(Say("This action will cause app downtime.")) @@ -170,7 +176,8 @@ var _ = Describe("restage Command", func() { Expect(spaceForApp).To(Equal(fakeConfig.TargetedSpace())) Expect(orgForApp).To(Equal(fakeConfig.TargetedOrganization())) Expect(pkgGUID).To(Equal("earliest-package-guid")) - Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyDefault)) + Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyRolling)) + Expect(opts.MaxInFlight).To(Equal(4)) Expect(opts.NoWait).To(Equal(false)) Expect(opts.AppAction).To(Equal(constant.ApplicationRestarting)) }) @@ -188,4 +195,36 @@ var _ = Describe("restage Command", func() { It("succeeds", func() { Expect(executeErr).To(Not(HaveOccurred())) }) + + DescribeTable("ValidateFlags returns an error", + func(setup func(), expectedErr error) { + setup() + err := cmd.ValidateFlags() + if expectedErr == nil { + Expect(err).To(BeNil()) + } else { + Expect(err).To(MatchError(expectedErr)) + } + }, + Entry("max-in-flight is passed without strategy", + func() { + cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyDefault} + maxInFlight := 10 + cmd.MaxInFlight = &maxInFlight + }, + translatableerror.RequiredFlagsError{ + Arg1: "--max-in-flight", + Arg2: "--strategy", + }), + + Entry("max-in-flight is smaller than 1", + func() { + cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyRolling} + maxInFlight := 0 + cmd.MaxInFlight = &maxInFlight + }, + translatableerror.IncorrectUsageError{ + Message: "--max-in-flight must be greater than or equal to 1", + }), + ) }) diff --git a/command/v7/restart_command.go b/command/v7/restart_command.go index 1a453d50b9e..dfbe9c5e4a2 100644 --- a/command/v7/restart_command.go +++ b/command/v7/restart_command.go @@ -6,12 +6,14 @@ import ( "code.cloudfoundry.org/cli/api/logcache" "code.cloudfoundry.org/cli/command" "code.cloudfoundry.org/cli/command/flag" + "code.cloudfoundry.org/cli/command/translatableerror" "code.cloudfoundry.org/cli/command/v7/shared" ) type RestartCommand struct { BaseCommand + MaxInFlight *int `long:"max-in-flight" description:"Defines the maximum number of instances that will be actively restarted at any given time. Only applies when --strategy flag is specified."` RequiredArgs flag.AppName `positional-args:"yes"` Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy can be canary, rolling or null."` NoWait bool `long:"no-wait" description:"Exit when the first instance of the web process is healthy"` @@ -50,6 +52,11 @@ func (cmd RestartCommand) Execute(args []string) error { return err } + err = cmd.ValidateFlags() + if err != nil { + return err + } + app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) cmd.UI.DisplayWarnings(warnings) if err != nil { @@ -77,6 +84,11 @@ func (cmd RestartCommand) Execute(args []string) error { NoWait: cmd.NoWait, AppAction: constant.ApplicationRestarting, } + + if cmd.MaxInFlight != nil { + opts.MaxInFlight = *cmd.MaxInFlight + } + if packageGUID != "" { err = cmd.Stager.StageAndStart(app, cmd.Config.TargetedSpace(), cmd.Config.TargetedOrganization(), packageGUID, opts) if err != nil { @@ -91,3 +103,14 @@ func (cmd RestartCommand) Execute(args []string) error { return nil } + +func (cmd RestartCommand) ValidateFlags() error { + switch true { + case cmd.Strategy.Name == constant.DeploymentStrategyDefault && cmd.MaxInFlight != nil: + return translatableerror.RequiredFlagsError{Arg1: "--max-in-flight", Arg2: "--strategy"} + case cmd.Strategy.Name != constant.DeploymentStrategyDefault && cmd.MaxInFlight != nil && *cmd.MaxInFlight < 1: + return translatableerror.IncorrectUsageError{Message: "--max-in-flight must be greater than or equal to 1"} + } + + return nil +} diff --git a/command/v7/restart_command_test.go b/command/v7/restart_command_test.go index 2cea1f43b97..4d4f8e828bd 100644 --- a/command/v7/restart_command_test.go +++ b/command/v7/restart_command_test.go @@ -8,6 +8,7 @@ import ( "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" "code.cloudfoundry.org/cli/command/commandfakes" "code.cloudfoundry.org/cli/command/flag" + "code.cloudfoundry.org/cli/command/translatableerror" v7 "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/command/v7/shared/sharedfakes" "code.cloudfoundry.org/cli/command/v7/v7fakes" @@ -187,4 +188,35 @@ var _ = Describe("restart Command", func() { }) }) + DescribeTable("ValidateFlags returns an error", + func(setup func(), expectedErr error) { + setup() + err := cmd.ValidateFlags() + if expectedErr == nil { + Expect(err).To(BeNil()) + } else { + Expect(err).To(MatchError(expectedErr)) + } + }, + + Entry("max-in-flight is passed without strategy", + func() { + maxInFlight := 10 + cmd.MaxInFlight = &maxInFlight + }, + translatableerror.RequiredFlagsError{ + Arg1: "--max-in-flight", + Arg2: "--strategy", + }), + + Entry("max-in-flight is smaller than 1", + func() { + cmd.Strategy = flag.DeploymentStrategy{Name: constant.DeploymentStrategyRolling} + maxInFlight := 0 + cmd.MaxInFlight = &maxInFlight + }, + translatableerror.IncorrectUsageError{ + Message: "--max-in-flight must be greater than or equal to 1", + }), + ) }) diff --git a/command/v7/rollback_command.go b/command/v7/rollback_command.go index 84119377363..14854c42a36 100644 --- a/command/v7/rollback_command.go +++ b/command/v7/rollback_command.go @@ -8,6 +8,7 @@ import ( "code.cloudfoundry.org/cli/cf/errors" "code.cloudfoundry.org/cli/command" "code.cloudfoundry.org/cli/command/flag" + "code.cloudfoundry.org/cli/command/translatableerror" "code.cloudfoundry.org/cli/command/v7/shared" ) @@ -16,6 +17,7 @@ type RollbackCommand struct { Force bool `short:"f" description:"Force rollback without confirmation"` RequiredArgs flag.AppName `positional-args:"yes"` + MaxInFlight *int `long:"max-in-flight" description:"Defines the maximum number of instances that will be actively being rolled back."` Strategy flag.DeploymentStrategy `long:"strategy" description:"Deployment strategy can be canary or rolling. When not specified, it defaults to rolling."` Version flag.Revision `long:"version" required:"true" description:"Roll back to the specified revision"` relatedCommands interface{} `related_commands:"revisions"` @@ -50,6 +52,11 @@ func (cmd RollbackCommand) Execute(args []string) error { return err } + err = cmd.ValidateFlags() + if err != nil { + return err + } + app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.AppName, cmd.Config.TargetedSpace().GUID) cmd.UI.DisplayWarnings(warnings) if err != nil { @@ -72,10 +79,6 @@ func (cmd RollbackCommand) Execute(args []string) error { return err } - if err != nil { - return err - } - // TODO Localization? if !cmd.Force { cmd.UI.DisplayTextWithFlavor("Rolling '{{.AppName}}' back to revision '{{.TargetRevision}}' will create a new revision. The new revision will use the settings from revision '{{.TargetRevision}}'.", map[string]interface{}{ @@ -108,9 +111,12 @@ func (cmd RollbackCommand) Execute(args []string) error { }) opts := shared.AppStartOpts{ - Strategy: constant.DeploymentStrategyRolling, - NoWait: false, AppAction: constant.ApplicationRollingBack, + NoWait: false, + Strategy: constant.DeploymentStrategyRolling, + } + if cmd.MaxInFlight != nil { + opts.MaxInFlight = *cmd.MaxInFlight } if cmd.Strategy.Name != "" { @@ -126,3 +132,12 @@ func (cmd RollbackCommand) Execute(args []string) error { return nil } + +func (cmd RollbackCommand) ValidateFlags() error { + switch { + case cmd.MaxInFlight != nil && *cmd.MaxInFlight < 1: + return translatableerror.IncorrectUsageError{Message: "--max-in-flight must be greater than or equal to 1"} + } + + return nil +} diff --git a/command/v7/rollback_command_test.go b/command/v7/rollback_command_test.go index 6f80f7ca15f..9edcfc564a9 100644 --- a/command/v7/rollback_command_test.go +++ b/command/v7/rollback_command_test.go @@ -8,6 +8,7 @@ import ( "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" "code.cloudfoundry.org/cli/command/commandfakes" "code.cloudfoundry.org/cli/command/flag" + "code.cloudfoundry.org/cli/command/translatableerror" v7 "code.cloudfoundry.org/cli/command/v7" "code.cloudfoundry.org/cli/command/v7/shared/sharedfakes" "code.cloudfoundry.org/cli/command/v7/v7fakes" @@ -76,6 +77,8 @@ var _ = Describe("rollback Command", func() { }, Stager: fakeAppStager, } + maxInFlight := 5 + cmd.MaxInFlight = &maxInFlight }) JustBeforeEach(func() { @@ -220,6 +223,7 @@ var _ = Describe("rollback Command", func() { Expect(revisionGUID).To(Equal("some-1-guid")) Expect(opts.AppAction).To(Equal(constant.ApplicationRollingBack)) Expect(opts.Strategy).To(Equal(constant.DeploymentStrategyRolling)) + Expect(opts.MaxInFlight).To(Equal(5)) Expect(testUI.Out).To(Say("Rolling '%s' back to revision '1' will create a new revision. The new revision will use the settings from revision '1'.", app)) Expect(testUI.Out).To(Say("Are you sure you want to continue?")) @@ -286,4 +290,24 @@ var _ = Describe("rollback Command", func() { }) }) + DescribeTable("ValidateFlags returns an error", + func(setup func(), expectedErr error) { + setup() + err := cmd.ValidateFlags() + if expectedErr == nil { + Expect(err).To(BeNil()) + } else { + Expect(err).To(MatchError(expectedErr)) + } + }, + + Entry("max-in-flight is smaller than 1", + func() { + maxInFlight := 0 + cmd.MaxInFlight = &maxInFlight + }, + translatableerror.IncorrectUsageError{ + Message: "--max-in-flight must be greater than or equal to 1", + }), + ) }) diff --git a/command/v7/shared/app_stager.go b/command/v7/shared/app_stager.go index 5364bbd31c2..2aed583033d 100644 --- a/command/v7/shared/app_stager.go +++ b/command/v7/shared/app_stager.go @@ -29,9 +29,10 @@ type AppStager interface { } type AppStartOpts struct { - Strategy constant.DeploymentStrategy - NoWait bool - AppAction constant.ApplicationAction + AppAction constant.ApplicationAction + MaxInFlight int + NoWait bool + Strategy constant.DeploymentStrategy } type Stager struct { @@ -124,9 +125,11 @@ func (stager *Stager) StartApp(app resources.Application, space configv3.Space, switch opts.AppAction { case constant.ApplicationRollingBack: dep.RevisionGUID = resourceGuid + dep.Options.MaxInFlight = opts.MaxInFlight deploymentGUID, warnings, err = stager.Actor.CreateDeployment(dep) default: dep.DropletGUID = resourceGuid + dep.Options.MaxInFlight = opts.MaxInFlight deploymentGUID, warnings, err = stager.Actor.CreateDeployment(dep) } diff --git a/command/v7/shared/app_stager_test.go b/command/v7/shared/app_stager_test.go index 9c6b936ea59..067ddb96310 100644 --- a/command/v7/shared/app_stager_test.go +++ b/command/v7/shared/app_stager_test.go @@ -35,6 +35,7 @@ var _ = Describe("app stager", func() { organization configv3.Organization pkgGUID string strategy constant.DeploymentStrategy + maxInFlight int noWait bool appAction constant.ApplicationAction @@ -58,6 +59,7 @@ var _ = Describe("app stager", func() { space = configv3.Space{Name: "some-space", GUID: "some-space-guid"} organization = configv3.Organization{Name: "some-org"} strategy = constant.DeploymentStrategyDefault + maxInFlight = 2 appAction = constant.ApplicationRestarting fakeActor.GetStreamingLogsForApplicationByNameAndSpaceStub = func(appName string, spaceGUID string, client sharedaction.LogCacheClient) (<-chan sharedaction.LogMessage, <-chan error, context.CancelFunc, v7action.Warnings, error) { @@ -107,9 +109,10 @@ var _ = Describe("app stager", func() { JustBeforeEach(func() { appStager = shared.NewAppStager(fakeActor, testUI, fakeConfig, fakeLogCacheClient) opts := shared.AppStartOpts{ - Strategy: strategy, - NoWait: noWait, - AppAction: appAction, + AppAction: appAction, + MaxInFlight: maxInFlight, + NoWait: noWait, + Strategy: strategy, } executeErr = appStager.StageAndStart(app, space, organization, pkgGUID, opts) }) @@ -173,13 +176,8 @@ var _ = Describe("app stager", func() { BeforeEach(func() { strategy = constant.DeploymentStrategyRolling noWait = true + maxInFlight = 5 appStager = shared.NewAppStager(fakeActor, testUI, fakeConfig, fakeLogCacheClient) - opts := shared.AppStartOpts{ - Strategy: strategy, - NoWait: noWait, - AppAction: appAction, - } - executeErr = appStager.StageAndStart(app, space, organization, pkgGUID, opts) }) It("Restages and starts the app", func() { @@ -190,6 +188,13 @@ var _ = Describe("app stager", func() { Expect(testUI.Out).To(Say("First instance restaged correctly, restaging remaining in the background")) }) + + It("creates expected deployment", func() { + Expect(fakeActor.CreateDeploymentCallCount()).To(Equal(1), "CreateDeployment...") + dep := fakeActor.CreateDeploymentArgsForCall(0) + Expect(dep.Options.MaxInFlight).To(Equal(5)) + Expect(string(dep.Strategy)).To(Equal("rolling")) + }) }) }) @@ -344,6 +349,7 @@ var _ = Describe("app stager", func() { strategy = constant.DeploymentStrategyDefault noWait = true + maxInFlight = 2 appAction = constant.ApplicationRestarting app = resources.Application{GUID: "app-guid", Name: "app-name", State: constant.ApplicationStarted} @@ -358,9 +364,10 @@ var _ = Describe("app stager", func() { JustBeforeEach(func() { appStager = shared.NewAppStager(fakeActor, testUI, fakeConfig, fakeLogCacheClient) opts := shared.AppStartOpts{ - Strategy: strategy, - NoWait: noWait, - AppAction: appAction, + Strategy: strategy, + NoWait: noWait, + MaxInFlight: maxInFlight, + AppAction: appAction, } executeErr = appStager.StartApp(app, space, organization, resourceGUID, opts) }) @@ -399,6 +406,7 @@ var _ = Describe("app stager", func() { dep := fakeActor.CreateDeploymentArgsForCall(0) Expect(dep.Relationships[constant.RelationshipTypeApplication].GUID).To(Equal(app.GUID)) Expect(dep.RevisionGUID).To(Equal("revision-guid")) + Expect(dep.Options.MaxInFlight).To(Equal(2)) Expect(testUI.Err).To(Say("create-deployment-warning")) Expect(testUI.Out).To(Say("Waiting for app to deploy...")) @@ -408,6 +416,10 @@ var _ = Describe("app stager", func() { }) When("the app starts successfully", func() { + BeforeEach(func() { + maxInFlight = 3 + }) + It("displays output for each step of deploying", func() { Expect(executeErr).To(BeNil()) @@ -416,6 +428,7 @@ var _ = Describe("app stager", func() { dep := fakeActor.CreateDeploymentArgsForCall(0) Expect(dep.Relationships[constant.RelationshipTypeApplication].GUID).To(Equal(app.GUID)) Expect(dep.DropletGUID).To(Equal("droplet-guid")) + Expect(dep.Options.MaxInFlight).To(Equal(3)) Expect(testUI.Err).To(Say("create-deployment-warning")) Expect(testUI.Out).To(Say("Waiting for app to deploy...")) @@ -627,5 +640,4 @@ var _ = Describe("app stager", func() { Expect(executeErr).To(Not(HaveOccurred())) }) }) - }) diff --git a/integration/v7/isolated/continue_deployment_test.go b/integration/v7/isolated/continue_deployment_test.go index 18ea3dab317..4c1bf73370e 100644 --- a/integration/v7/isolated/continue_deployment_test.go +++ b/integration/v7/isolated/continue_deployment_test.go @@ -87,7 +87,7 @@ var _ = Describe("Continue Deployment", func() { When("There is a canary deployment", func() { It("succeeds", func() { helpers.WithHelloWorldApp(func(appDir string) { - helpers.CF("push", appName, "-p", appDir, "--strategy=canary", "--no-wait").Wait() + helpers.CF("push", appName, "-p", appDir, "--strategy=canary").Wait() }) session := helpers.CF("continue-deployment", appName) diff --git a/integration/v7/isolated/copy_source_command_test.go b/integration/v7/isolated/copy_source_command_test.go index 83891422636..bd8829140ca 100644 --- a/integration/v7/isolated/copy_source_command_test.go +++ b/integration/v7/isolated/copy_source_command_test.go @@ -449,6 +449,7 @@ func helpText(session *Session) { Eventually(session).Should(Say(`cf copy-source SOURCE_APP DESTINATION_APP \[-s TARGET_SPACE \[-o TARGET_ORG\]\] \[--no-restart\] \[--strategy STRATEGY\] \[--no-wait\]`)) Eventually(session).Should(Say("OPTIONS:")) Eventually(session).Should(Say(`--strategy\s+Deployment strategy can be canary, rolling or null`)) + Eventually(session).Should(Say(`--max-in-flight\s+Defines the maximum number of instances`)) Eventually(session).Should(Say(`--no-wait\s+ Exit when the first instance of the web process is healthy`)) Eventually(session).Should(Say(`--no-restart\s+Do not restage the destination application`)) Eventually(session).Should(Say(`--organization, -o\s+Org that contains the destination application`)) diff --git a/integration/v7/isolated/restage_command_test.go b/integration/v7/isolated/restage_command_test.go index 08ce275bc18..8f30228cc3b 100644 --- a/integration/v7/isolated/restage_command_test.go +++ b/integration/v7/isolated/restage_command_test.go @@ -31,8 +31,9 @@ var _ = Describe("restage command", func() { Eventually(session).Should(Say("ALIAS:")) Eventually(session).Should(Say("rg")) Eventually(session).Should(Say("OPTIONS:")) - Eventually(session).Should(Say("--strategy Deployment strategy can be canary, rolling or null")) - Eventually(session).Should(Say("--no-wait Exit when the first instance of the web process is healthy")) + Eventually(session).Should(Say(`--strategy\s+Deployment strategy can be canary, rolling or null`)) + Eventually(session).Should(Say("--max-in-flight")) + Eventually(session).Should(Say(`--no-wait\s+Exit when the first instance of the web process is healthy`)) Eventually(session).Should(Say("ENVIRONMENT:")) Eventually(session).Should(Say(`CF_STAGING_TIMEOUT=15\s+Max wait time for staging, in minutes`)) Eventually(session).Should(Say(`CF_STARTUP_TIMEOUT=5\s+Max wait time for app instance startup, in minutes`)) @@ -145,7 +146,7 @@ var _ = Describe("restage command", func() { userName, _ := helpers.GetCredentials() session := helpers.CustomCF(helpers.CFEnv{ EnvVars: map[string]string{"CF_STARTUP_TIMEOUT": "0.1"}, - }, "restage", appName, "--strategy", "rolling") + }, "restage", appName, "--strategy", "rolling", "--max-in-flight", "3") Consistently(session.Err).ShouldNot(Say(`This action will cause app downtime\.`)) Eventually(session).Should(Say(`Restaging app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) diff --git a/integration/v7/isolated/restart_command_test.go b/integration/v7/isolated/restart_command_test.go index 394c8f147bf..bd7bd8a5923 100644 --- a/integration/v7/isolated/restart_command_test.go +++ b/integration/v7/isolated/restart_command_test.go @@ -51,8 +51,9 @@ var _ = Describe("restart command", func() { Eventually(session).Should(Say("ALIAS:")) Eventually(session).Should(Say("rs")) Eventually(session).Should(Say("OPTIONS:")) - Eventually(session).Should(Say("--strategy Deployment strategy can be canary, rolling or null.")) - Eventually(session).Should(Say("--no-wait Exit when the first instance of the web process is healthy")) + Eventually(session).Should(Say("--max-in-flight")) + Eventually(session).Should(Say(`--strategy\s+Deployment strategy can be canary, rolling or null.`)) + Eventually(session).Should(Say(`--no-wait\s+Exit when the first instance of the web process is healthy`)) Eventually(session).Should(Say("ENVIRONMENT:")) Eventually(session).Should(Say(`CF_STAGING_TIMEOUT=15\s+Max wait time for staging, in minutes`)) Eventually(session).Should(Say(`CF_STARTUP_TIMEOUT=5\s+Max wait time for app instance startup, in minutes`)) @@ -101,7 +102,7 @@ var _ = Describe("restart command", func() { }) }) It("creates a deploy", func() { - session := helpers.CF("restart", appName, "--strategy=rolling") + session := helpers.CF("restart", appName, "--strategy=rolling", "--max-in-flight=3") Eventually(session).Should(Say(`Restarting app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) Eventually(session).Should(Say(`Waiting for app to deploy\.\.\.`)) diff --git a/integration/v7/isolated/rollback_command_test.go b/integration/v7/isolated/rollback_command_test.go index 75c12d6f621..056c2115b9e 100644 --- a/integration/v7/isolated/rollback_command_test.go +++ b/integration/v7/isolated/rollback_command_test.go @@ -34,9 +34,10 @@ var _ = Describe("rollback command", func() { Expect(session).To(Say("USAGE:")) Expect(session).To(Say(`cf rollback APP_NAME \[--version VERSION\]`)) Expect(session).To(Say("OPTIONS:")) - Expect(session).To(Say("-f Force rollback without confirmation")) - Expect(session).To(Say("--strategy Deployment strategy can be canary or rolling. When not specified, it defaults to rolling.")) - Expect(session).To(Say("--version Roll back to the specified revision")) + Expect(session).To(Say(`-f\s+Force rollback without confirmation`)) + Expect(session).To(Say("--max-in-flight")) + Expect(session).To(Say(`--strategy\s+Deployment strategy can be canary or rolling. When not specified, it defaults to rolling.`)) + Expect(session).To(Say(`--version\s+Roll back to the specified revision`)) Expect(session).To(Say("SEE ALSO:")) Expect(session).To(Say("revisions")) }) @@ -113,7 +114,7 @@ applications: When("the -f flag is provided", func() { It("does not prompt the user, and just rolls back", func() { - session := helpers.CF("rollback", appName, "--version", "1", "-f") + session := helpers.CF("rollback", appName, "--version", "1", "-f", "--max-in-flight", "3") Eventually(session).Should(Exit(0)) Expect(session).To(HaveRollbackOutput(appName, orgName, spaceName, userName)) diff --git a/integration/v7/push/help_test.go b/integration/v7/push/help_test.go index c86d0b9999b..32845920753 100644 --- a/integration/v7/push/help_test.go +++ b/integration/v7/push/help_test.go @@ -81,6 +81,7 @@ var _ = Describe("help", func() { Eventually(session).Should(Say(`--instances, -i`)) Eventually(session).Should(Say(`--log-rate-limit, -l\s+Log rate limit per second, in bytes \(e.g. 128B, 4K, 1M\). -l=-1 represents unlimited`)) Eventually(session).Should(Say(`--manifest, -f`)) + Eventually(session).Should(Say(`--max-in-flight`)) Eventually(session).Should(Say(`--memory, -m`)) Eventually(session).Should(Say(`--no-manifest`)) Eventually(session).Should(Say(`--no-route`)) diff --git a/integration/v7/push/rolling_push_test.go b/integration/v7/push/rolling_push_test.go index 689faf5244f..98e26aeca78 100644 --- a/integration/v7/push/rolling_push_test.go +++ b/integration/v7/push/rolling_push_test.go @@ -53,6 +53,30 @@ var _ = Describe("push with --strategy rolling", func() { Expect(session).To(Say(`#0\s+running`)) }) }) + + It("pushes the app and creates a new deployment with max in flight set", func() { + helpers.WithHelloWorldApp(func(appDir string) { + session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, + PushCommandName, appName, "--strategy", "rolling", "--max-in-flight", "3", + ) + + Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Pushing app %s to org %s / space %s as %s\.\.\.`, appName, organization, space, userName)) + Expect(session).To(Say(`Packaging files to upload\.\.\.`)) + Expect(session).To(Say(`Uploading files\.\.\.`)) + Expect(session).To(Say(`100.00%`)) + Expect(session).To(Say(`Waiting for API to complete processing files\.\.\.`)) + Expect(session).To(Say(`Staging app and tracing logs\.\.\.`)) + Expect(session).To(Say(`Starting deployment for app %s\.\.\.`, appName)) + Expect(session).To(Say(`Waiting for app to deploy\.\.\.`)) + Expect(session).To(Say(`name:\s+%s`, appName)) + Expect(session).To(Say(`requested state:\s+started`)) + Expect(session).To(Say(`routes:\s+%s.%s`, appName, helpers.DefaultSharedDomain())) + Expect(session).To(Say(`type:\s+web`)) + Expect(session).To(Say(`start command:\s+%s`, helpers.StaticfileBuildpackStartCommand)) + Expect(session).To(Say(`#0\s+running`)) + }) + }) }) When("canceling the deployment", func() { diff --git a/resources/deployment_resource.go b/resources/deployment_resource.go index aa342468d15..6e5b6cc71a3 100644 --- a/resources/deployment_resource.go +++ b/resources/deployment_resource.go @@ -13,6 +13,7 @@ type Deployment struct { StatusValue constant.DeploymentStatusValue StatusReason constant.DeploymentStatusReason LastStatusChange string + Options DeploymentOpts RevisionGUID string DropletGUID string CreatedAt string @@ -22,6 +23,10 @@ type Deployment struct { Strategy constant.DeploymentStrategy } +type DeploymentOpts struct { + MaxInFlight int `json:"max_in_flight"` +} + // MarshalJSON converts a Deployment into a Cloud Controller Deployment. func (d Deployment) MarshalJSON() ([]byte, error) { type Revision struct { @@ -33,6 +38,7 @@ func (d Deployment) MarshalJSON() ([]byte, error) { var ccDeployment struct { Droplet *Droplet `json:"droplet,omitempty"` + Options *DeploymentOpts `json:"options,omitempty"` Revision *Revision `json:"revision,omitempty"` Strategy constant.DeploymentStrategy `json:"strategy,omitempty"` Relationships Relationships `json:"relationships,omitempty"` @@ -50,6 +56,14 @@ func (d Deployment) MarshalJSON() ([]byte, error) { ccDeployment.Strategy = d.Strategy } + var b DeploymentOpts + if d.Options != b { + ccDeployment.Options = &d.Options + if d.Options.MaxInFlight < 1 { + ccDeployment.Options.MaxInFlight = 1 + } + } + ccDeployment.Relationships = d.Relationships return json.Marshal(ccDeployment) @@ -72,6 +86,7 @@ func (d *Deployment) UnmarshalJSON(data []byte) error { Droplet Droplet `json:"droplet,omitempty"` NewProcesses []Process `json:"new_processes,omitempty"` Strategy constant.DeploymentStrategy `json:"strategy"` + Options DeploymentOpts `json:"options,omitempty"` } err := cloudcontroller.DecodeJSON(data, &ccDeployment) @@ -89,6 +104,7 @@ func (d *Deployment) UnmarshalJSON(data []byte) error { d.DropletGUID = ccDeployment.Droplet.GUID d.NewProcesses = ccDeployment.NewProcesses d.Strategy = ccDeployment.Strategy + d.Options = ccDeployment.Options return nil } From a5ed00bfd2b466411b5100c2a9b833e9f5069093 Mon Sep 17 00:00:00 2001 From: Michael Chinigo Date: Tue, 13 Aug 2024 16:06:39 -0400 Subject: [PATCH 08/33] `cf revisions` no longer reports EXPERIMENTAL notice [main] (#3062) * `cf revisions` no longer reports EXPERIMENTAL notice * Move `revision` and `revisions` commands into APPS section of help * Remove negative assertions for revision commands' experimental status * Restore "revision" command to experimental status * `cf rollback` no longer reports EXPERIMENTAL status * Remove superfluous newline --- command/common/internal/help_all_display.go | 3 ++- command/v7/revisions_command.go | 4 ---- command/v7/revisions_command_test.go | 4 ---- command/v7/rollback_command.go | 3 --- command/v7/rollback_command_test.go | 4 ---- integration/v7/isolated/revisions_command_test.go | 2 +- integration/v7/isolated/rollback_command_test.go | 2 +- 7 files changed, 4 insertions(+), 18 deletions(-) diff --git a/command/common/internal/help_all_display.go b/command/common/internal/help_all_display.go index f2dbcc4c981..9090f70f46f 100644 --- a/command/common/internal/help_all_display.go +++ b/command/common/internal/help_all_display.go @@ -17,6 +17,7 @@ var HelpCategoryList = []HelpCategory{ {"start", "stop", "restart", "stage-package", "restage", "restart-app-instance"}, {"run-task", "tasks", "terminate-task"}, {"packages", "create-package"}, + {"revisions", "rollback"}, {"droplets", "set-droplet", "download-droplet"}, {"events", "logs"}, {"env", "set-env", "unset-env"}, @@ -172,7 +173,7 @@ var ExperimentalHelpCategoryList = []HelpCategory{ { CategoryName: "EXPERIMENTAL COMMANDS:", CommandList: [][]string{ - {"revisions", "revision", "rollback"}, + {"revision"}, }, }, } diff --git a/command/v7/revisions_command.go b/command/v7/revisions_command.go index d2b1b87b9b8..2c309350b61 100644 --- a/command/v7/revisions_command.go +++ b/command/v7/revisions_command.go @@ -5,7 +5,6 @@ import ( "strconv" "code.cloudfoundry.org/cli/actor/v7action" - "code.cloudfoundry.org/cli/command" "code.cloudfoundry.org/cli/command/flag" "code.cloudfoundry.org/cli/resources" "code.cloudfoundry.org/cli/util/ui" @@ -26,9 +25,6 @@ type RevisionsCommand struct { } func (cmd RevisionsCommand) Execute(_ []string) error { - cmd.UI.DisplayWarning(command.ExperimentalWarning) - cmd.UI.DisplayNewline() - err := cmd.SharedActor.CheckTarget(true, true) if err != nil { return err diff --git a/command/v7/revisions_command_test.go b/command/v7/revisions_command_test.go index e7a7987ea46..6af5b8ff3d9 100644 --- a/command/v7/revisions_command_test.go +++ b/command/v7/revisions_command_test.go @@ -59,10 +59,6 @@ var _ = Describe("revisions Command", func() { executeErr = cmd.Execute(nil) }) - It("displays the experimental warning", func() { - Expect(testUI.Err).To(Say("This command is in EXPERIMENTAL stage and may change without notice")) - }) - When("checking target fails", func() { BeforeEach(func() { fakeSharedActor.CheckTargetReturns(actionerror.NotLoggedInError{BinaryName: binaryName}) diff --git a/command/v7/rollback_command.go b/command/v7/rollback_command.go index 14854c42a36..29c7c2e7169 100644 --- a/command/v7/rollback_command.go +++ b/command/v7/rollback_command.go @@ -38,9 +38,6 @@ func (cmd *RollbackCommand) Setup(config command.Config, ui command.UI) error { } func (cmd RollbackCommand) Execute(args []string) error { - cmd.UI.DisplayWarning(command.ExperimentalWarning) - cmd.UI.DisplayNewline() - targetRevision := int(cmd.Version.Value) err := cmd.SharedActor.CheckTarget(true, true) if err != nil { diff --git a/command/v7/rollback_command_test.go b/command/v7/rollback_command_test.go index 9edcfc564a9..3218d02a9b6 100644 --- a/command/v7/rollback_command_test.go +++ b/command/v7/rollback_command_test.go @@ -85,10 +85,6 @@ var _ = Describe("rollback Command", func() { executeErr = cmd.Execute(nil) }) - It("displays the experimental warning", func() { - Expect(testUI.Err).To(Say("This command is in EXPERIMENTAL stage and may change without notice")) - }) - When("checking target fails", func() { BeforeEach(func() { fakeSharedActor.CheckTargetReturns(actionerror.NoOrganizationTargetedError{BinaryName: binaryName}) diff --git a/integration/v7/isolated/revisions_command_test.go b/integration/v7/isolated/revisions_command_test.go index c5816d0aa80..952654b1b7a 100644 --- a/integration/v7/isolated/revisions_command_test.go +++ b/integration/v7/isolated/revisions_command_test.go @@ -33,7 +33,7 @@ var _ = Describe("revisions command", func() { It("appears in cf help -a", func() { session := helpers.CF("help", "-a") Eventually(session).Should(Exit(0)) - Expect(session).To(HaveCommandInCategoryWithDescription("revisions", "EXPERIMENTAL COMMANDS", "List revisions of an app")) + Expect(session).To(HaveCommandInCategoryWithDescription("revisions", "APPS", "List revisions of an app")) }) It("Displays command usage to output", func() { diff --git a/integration/v7/isolated/rollback_command_test.go b/integration/v7/isolated/rollback_command_test.go index 056c2115b9e..3e8bf1eb0cd 100644 --- a/integration/v7/isolated/rollback_command_test.go +++ b/integration/v7/isolated/rollback_command_test.go @@ -21,7 +21,7 @@ var _ = Describe("rollback command", func() { It("appears in cf help -a", func() { session := helpers.CF("help", "-a") Eventually(session).Should(Exit(0)) - Expect(session).To(HaveCommandInCategoryWithDescription("rollback", "EXPERIMENTAL COMMANDS", "Rollback to the specified revision of an app")) + Expect(session).To(HaveCommandInCategoryWithDescription("rollback", "APPS", "Rollback to the specified revision of an app")) }) It("Displays rollback command usage to output", func() { From 31ffcb2811f1153ac456b2a6a369aeb69d941e3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 10:11:45 -0700 Subject: [PATCH 09/33] Bump code.cloudfoundry.org/tlsconfig (#3105) Bumps [code.cloudfoundry.org/tlsconfig](https://github.com/cloudfoundry/tlsconfig) from 0.0.0-20240510172918-c1e19801fe80 to 0.1.0. - [Release notes](https://github.com/cloudfoundry/tlsconfig/releases) - [Commits](https://github.com/cloudfoundry/tlsconfig/commits/v0.1.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/tlsconfig dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 19e5b02d3c1..f5adcd206b6 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f code.cloudfoundry.org/jsonry v1.1.4 code.cloudfoundry.org/lager/v3 v3.0.3 - code.cloudfoundry.org/tlsconfig v0.0.0-20240510172918-c1e19801fe80 + code.cloudfoundry.org/tlsconfig v0.1.0 code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 github.com/blang/semver/v4 v4.0.0 @@ -81,7 +81,7 @@ require ( golang.org/x/mod v0.20.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.23.0 // indirect + golang.org/x/sys v0.24.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.24.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/go.sum b/go.sum index dc9e5c02f7c..8752f95a829 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ code.cloudfoundry.org/jsonry v1.1.4/go.mod h1:6aKilShQP7w/Ez76h1El2/n9y2OkHuU56n code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be/go.mod h1:O2sS7gKP3HM2iemG+EnwvyNQK7pTSC6Foi4QiMp9sSk= code.cloudfoundry.org/lager/v3 v3.0.3 h1:/UTmadZfIaKuT/whEinSxK1mzRfNu1uPfvjFfGqiwzM= code.cloudfoundry.org/lager/v3 v3.0.3/go.mod h1:Zn5q1SrIuuHjEUE7xerMKt3ztunrJQCZETAo7rV0CH8= -code.cloudfoundry.org/tlsconfig v0.0.0-20240510172918-c1e19801fe80 h1:nxUb5mt6hUgetPgjwcApBzu7SvoweFyxeJndc6ueERU= -code.cloudfoundry.org/tlsconfig v0.0.0-20240510172918-c1e19801fe80/go.mod h1:nrEZdor0XB7oBXmkKyVtYFk3oGF6eCmryhVBOeGaUso= +code.cloudfoundry.org/tlsconfig v0.1.0 h1:/SGZk3K7t79cuhSVs/qZXayEnLV1kodmvU3EBcc4E4w= +code.cloudfoundry.org/tlsconfig v0.1.0/go.mod h1:6ymG8DjGLta+bnqdpUmdv88Ikje2VvOTq+8drVe4pUU= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d h1:M+zXqtXJqcsmpL76aU0tdl1ho23eYa4axYoM4gD62UA= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d/go.mod h1:YUJiVOr5xl0N/RjMxM1tHmgSpBbi5UM+KoVR5AoejO0= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= @@ -252,8 +252,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.step.sm/crypto v0.44.8 h1:jDSHL6FdB1UTA0d56ECNx9XtLVkewzeg38Vy3HWB3N8= -go.step.sm/crypto v0.44.8/go.mod h1:QEmu4T9YewrDuaJnrV1I0zWZ15aJ/mqRUfL5w3R2WgU= +go.step.sm/crypto v0.51.1 h1:ktUg/2hetEMiBAqgz502ktZDGoDoGrcHFg3XpkmkvvA= +go.step.sm/crypto v0.51.1/go.mod h1:PdrhttNU/tG9/YsVd4fdlysBN+UV503p0o2irFZQlAw= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -325,8 +325,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= From c904e401addc765830092e644df01f9ed6041c45 Mon Sep 17 00:00:00 2001 From: George Gelashvili Date: Wed, 14 Aug 2024 14:53:52 -0700 Subject: [PATCH 10/33] Print max-in-flight value alongside deployment status [main] (#3098) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Deduplicate tests from previous merge Co-authored-by: Greg Weresch * Print max-in-flight value as part of deployment information in process table when it is set to non-default value (currently 1) Co-authored-by: Greg Weresch * Fix flakey tests that look for output from cf app - these tests depend on a short-lived state Co-authored-by: Greg Weresch * Apply suggestions from code review Co-authored-by: João Pereira * Refactor app summary displayer tests to use Say instead of MatchRegexp Co-authored-by: Greg Weresch --------- Co-authored-by: Greg Weresch Co-authored-by: João Pereira --- .../ccv3/constant/deployment.go | 2 + command/v7/shared/app_summary_displayer.go | 20 +- .../v7/shared/app_summary_displayer_test.go | 376 +++++++++++++----- integration/v7/isolated/app_command_test.go | 22 +- 4 files changed, 304 insertions(+), 116 deletions(-) diff --git a/api/cloudcontroller/ccv3/constant/deployment.go b/api/cloudcontroller/ccv3/constant/deployment.go index 2ae6159ebb7..b35baa374c8 100644 --- a/api/cloudcontroller/ccv3/constant/deployment.go +++ b/api/cloudcontroller/ccv3/constant/deployment.go @@ -31,3 +31,5 @@ const ( DeploymentStatusValueActive DeploymentStatusValue = "ACTIVE" DeploymentStatusValueFinalized DeploymentStatusValue = "FINALIZED" ) + +const DeploymentMaxInFlightDefaultValue int = 1 diff --git a/command/v7/shared/app_summary_displayer.go b/command/v7/shared/app_summary_displayer.go index c784e8f4194..23d9affc4e0 100644 --- a/command/v7/shared/app_summary_displayer.go +++ b/command/v7/shared/app_summary_displayer.go @@ -162,6 +162,12 @@ func (display AppSummaryDisplayer) displayProcessTable(summary v7action.Detailed if summary.Deployment.StatusValue == constant.DeploymentStatusValueActive { display.UI.DisplayNewline() display.UI.DisplayText(display.getDeploymentStatusText(summary)) + + var maxInFlight = summary.Deployment.Options.MaxInFlight + if maxInFlight > 0 && maxInFlight != constant.DeploymentMaxInFlightDefaultValue { + display.UI.DisplayText(fmt.Sprintf("max-in-flight: %d", maxInFlight)) + } + if summary.Deployment.Strategy == constant.DeploymentStrategyCanary && summary.Deployment.StatusReason == constant.DeploymentStatusReasonPaused { display.UI.DisplayNewline() display.UI.DisplayText(fmt.Sprintf("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", summary.Application.Name, summary.Application.Name)) @@ -171,25 +177,15 @@ func (display AppSummaryDisplayer) displayProcessTable(summary v7action.Detailed func (display AppSummaryDisplayer) getDeploymentStatusText(summary v7action.DetailedApplicationSummary) string { var lastStatusChangeTime = display.getLastStatusChangeTime(summary) - if lastStatusChangeTime != "" { return fmt.Sprintf("%s deployment currently %s (since %s)", cases.Title(language.English, cases.NoLower).String(string(summary.Deployment.Strategy)), summary.Deployment.StatusReason, lastStatusChangeTime) } else { - var sb strings.Builder - sb.WriteString(fmt.Sprintf("%s deployment currently %s.", + return fmt.Sprintf("%s deployment currently %s.", cases.Title(language.English, cases.NoLower).String(string(summary.Deployment.Strategy)), - summary.Deployment.StatusReason)) - - if summary.Deployment.Strategy == constant.DeploymentStrategyCanary && summary.Deployment.StatusReason == constant.DeploymentStatusReasonPaused { - sb.WriteString("\n") - sb.WriteString(fmt.Sprintf( - "Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", - summary.Application.Name, summary.Application.Name)) - } - return sb.String() + summary.Deployment.StatusReason) } } diff --git a/command/v7/shared/app_summary_displayer_test.go b/command/v7/shared/app_summary_displayer_test.go index b95ece0a046..6494b5956e7 100644 --- a/command/v7/shared/app_summary_displayer_test.go +++ b/command/v7/shared/app_summary_displayer_test.go @@ -698,10 +698,59 @@ var _ = Describe("app summary displayer", func() { When("there is an active deployment", func() { var LastStatusChangeTimeString = "2024-07-29T17:32:29Z" var dateTimeRegexPattern = `[a-zA-Z]{3}\s\d{2}\s[a-zA-Z]{3}\s\d{2}\:\d{2}\:\d{2}\s[A-Z]{3}\s\d{4}` + var maxInFlightDefaultValue = 1 When("the deployment strategy is rolling", func() { When("the deployment is in progress", func() { - When("last status change has a timestamp", func() { + When("last status change has a timestamp and max-in-flight is non-default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyRolling, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonDeploying, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: 2, + }, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + }) + + It("displays max-in-flight value", func() { + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + }) + }) + + When("last status change has a timestamp and max-in-flight is default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyRolling, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonDeploying, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: maxInFlightDefaultValue, + }, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + }) + + It("does not display max-in-flight", func() { + Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + }) + }) + + When("an older version of CAPI does not return max-in-flight", func() { BeforeEach(func() { summary = v7action.DetailedApplicationSummary{ Deployment: resources.Deployment{ @@ -714,12 +763,15 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - var actualOut = fmt.Sprintf("%s", testUI.Out) - Expect(actualOut).To(MatchRegexp(`Rolling deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + }) + + It("does not display max-in-flight", func() { + Expect(testUI.Out).NotTo(Say(`max-in-flight`)) }) }) - When("last status change is an empty string", func() { + When("last status change is an empty string and max-in-flight is non-default", func() { BeforeEach(func() { summary = v7action.DetailedApplicationSummary{ Deployment: resources.Deployment{ @@ -727,6 +779,9 @@ var _ = Describe("app summary displayer", func() { StatusValue: constant.DeploymentStatusValueActive, StatusReason: constant.DeploymentStatusReasonDeploying, LastStatusChange: "", + Options: resources.DeploymentOpts{ + MaxInFlight: 2, + }, }, } }) @@ -735,126 +790,253 @@ var _ = Describe("app summary displayer", func() { Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING`)) Expect(testUI.Out).NotTo(Say(`\(since`)) }) + + It("displays max-in-flight value", func() { + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + }) + }) + + When("last status change is an empty string and max-in-flight is default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyRolling, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonDeploying, + LastStatusChange: "", + Options: resources.DeploymentOpts{ + MaxInFlight: maxInFlightDefaultValue, + }, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING`)) + Expect(testUI.Out).NotTo(Say(`\(since`)) + }) + + It("does not display max-in-flight", func() { + Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + }) }) }) When("the deployment is cancelled", func() { - BeforeEach(func() { - summary = v7action.DetailedApplicationSummary{ - Deployment: resources.Deployment{ - Strategy: constant.DeploymentStrategyRolling, - StatusValue: constant.DeploymentStatusValueActive, - StatusReason: constant.DeploymentStatusReasonCanceling, - LastStatusChange: LastStatusChangeTimeString, - }, - } + When("max-in-flight value is non-default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyRolling, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonCanceling, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: 2, + }, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Rolling deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) + }) + + It("displays max-in-flight value", func() { + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + }) }) - It("displays the message", func() { - var actualOut = fmt.Sprintf("%s", testUI.Out) - Expect(actualOut).To(MatchRegexp(`Rolling deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) + When("max-in-flight value is default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyRolling, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonCanceling, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: maxInFlightDefaultValue, + }, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Rolling deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) + }) + + It("does not display max-in-flight", func() { + Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + }) }) }) }) + When("the deployment strategy is canary", func() { When("the deployment is in progress", func() { - BeforeEach(func() { - summary = v7action.DetailedApplicationSummary{ - Deployment: resources.Deployment{ - Strategy: constant.DeploymentStrategyCanary, - StatusValue: constant.DeploymentStatusValueActive, - StatusReason: constant.DeploymentStatusReasonDeploying, - LastStatusChange: LastStatusChangeTimeString, - }, - } + When("max-in-flight value is non-default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonDeploying, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: 2, + }, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Canary deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) + }) + + It("displays max-in-flight value", func() { + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + }) }) - It("displays the message", func() { - var actualOut = fmt.Sprintf("%s", testUI.Out) - Expect(actualOut).To(MatchRegexp(`Canary deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) - Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) + When("max-in-flight value is default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonDeploying, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: maxInFlightDefaultValue, + }, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Canary deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) + }) + + It("does not display max-in-flight", func() { + Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + }) }) }) When("the deployment is paused", func() { - BeforeEach(func() { - summary = v7action.DetailedApplicationSummary{ - ApplicationSummary: v7action.ApplicationSummary{ - Application: resources.Application{ - Name: "foobar", + When("max-in-flight value is non-default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + ApplicationSummary: v7action.ApplicationSummary{ + Application: resources.Application{ + Name: "foobar", + }, }, - }, - Deployment: resources.Deployment{ - Strategy: constant.DeploymentStrategyCanary, - StatusValue: constant.DeploymentStatusValueActive, - StatusReason: constant.DeploymentStatusReasonPaused, - LastStatusChange: LastStatusChangeTimeString, - }, - } - }) + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonPaused, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: 2, + }, + }, + } + }) - It("displays the message", func() { - var actualOut = fmt.Sprintf("%s", testUI.Out) - Expect(actualOut).To(MatchRegexp(`Canary deployment currently PAUSED \(since %s\)`, dateTimeRegexPattern)) - Expect(testUI.Out).To(Say("Please run `cf continue-deployment foobar` to promote the canary deployment, or `cf cancel-deployment foobar` to rollback to the previous version.")) - }) - }) + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Canary deployment currently PAUSED \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say("Please run `cf continue-deployment foobar` to promote the canary deployment, or `cf cancel-deployment foobar` to rollback to the previous version.")) + }) - When("the deployment is canceling", func() { - BeforeEach(func() { - summary = v7action.DetailedApplicationSummary{ - Deployment: resources.Deployment{ - Strategy: constant.DeploymentStrategyCanary, - StatusValue: constant.DeploymentStatusValueActive, - StatusReason: constant.DeploymentStatusReasonCanceling, - LastStatusChange: LastStatusChangeTimeString, - }, - } + It("displays max-in-flight value", func() { + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + }) }) - It("displays the message", func() { - var actualOut = fmt.Sprintf("%s", testUI.Out) - Expect(actualOut).To(MatchRegexp(`Canary deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) - Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) - }) - }) - }) - When("the deployment strategy is canary", func() { - When("the deployment is paused", func() { - BeforeEach(func() { - summary = v7action.DetailedApplicationSummary{ - ApplicationSummary: v7action.ApplicationSummary{ - Application: resources.Application{ - Name: "some-app", + When("max-in-flight value is default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + ApplicationSummary: v7action.ApplicationSummary{ + Application: resources.Application{ + Name: "foobar", + }, }, - }, - Deployment: resources.Deployment{ - Strategy: constant.DeploymentStrategyCanary, - StatusValue: constant.DeploymentStatusValueActive, - StatusReason: constant.DeploymentStatusReasonPaused, - }, - } - }) + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonPaused, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: maxInFlightDefaultValue, + }, + }, + } + }) - It("displays the message", func() { - Expect(testUI.Out).To(Say("Canary deployment currently PAUSED.")) - Expect(testUI.Out).To(Say("Please run `cf continue-deployment some-app` to promote the canary deployment, or `cf cancel-deployment some-app` to rollback to the previous version.")) + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Canary deployment currently PAUSED \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say("Please run `cf continue-deployment foobar` to promote the canary deployment, or `cf cancel-deployment foobar` to rollback to the previous version.")) + }) + + It("does not display max-in-flight", func() { + Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + }) }) }) - When("the deployment is cancelled", func() { - BeforeEach(func() { - summary = v7action.DetailedApplicationSummary{ - Deployment: resources.Deployment{ - Strategy: constant.DeploymentStrategyCanary, - StatusValue: constant.DeploymentStatusValueActive, - StatusReason: constant.DeploymentStatusReasonCanceling, - }, - } + When("the deployment is canceling", func() { + When("max-in-flight value is non-default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonCanceling, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: 2, + }, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Canary deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) + }) + + It("displays max-in-flight value", func() { + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + }) }) - It("displays the message", func() { - Expect(testUI.Out).To(Say("Canary deployment currently CANCELING.")) + When("max-in-flight value is default", func() { + BeforeEach(func() { + summary = v7action.DetailedApplicationSummary{ + Deployment: resources.Deployment{ + Strategy: constant.DeploymentStrategyCanary, + StatusValue: constant.DeploymentStatusValueActive, + StatusReason: constant.DeploymentStatusReasonCanceling, + LastStatusChange: LastStatusChangeTimeString, + Options: resources.DeploymentOpts{ + MaxInFlight: maxInFlightDefaultValue, + }, + }, + } + }) + + It("displays the message", func() { + Expect(testUI.Out).To(Say(`Canary deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) + }) + + It("does not display max-in-flight", func() { + Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + }) }) }) }) @@ -876,6 +1058,10 @@ var _ = Describe("app summary displayer", func() { cases.Title(language.English, cases.NoLower).String(string(summary.Deployment.Strategy)), summary.Deployment.StatusReason))) }) + + It("does not display max-in-flight", func() { + Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + }) }) }) }) diff --git a/integration/v7/isolated/app_command_test.go b/integration/v7/isolated/app_command_test.go index 4fe317aa157..d262d96a3c6 100644 --- a/integration/v7/isolated/app_command_test.go +++ b/integration/v7/isolated/app_command_test.go @@ -267,7 +267,7 @@ applications: session := helpers.CF("restart", appName, "--strategy", "rolling") session1 := helpers.CF("app", appName) - Eventually(session1).Should(Say("Rolling deployment currently DEPLOYING.")) + Eventually(session1).Should(Say("Rolling deployment currently DEPLOYING")) Eventually(session).Should(Exit(0)) Eventually(session1).Should(Exit(0)) }) @@ -279,9 +279,11 @@ applications: return helpers.CF("cancel-deployment", appName).Wait() }).Should(Exit(0)) - session2 := helpers.CF("app", appName) - Eventually(session2).Should(Say("Rolling deployment currently CANCELING.")) - Eventually(session2).Should(Exit(0)) + Eventually(func(g Gomega) { + session := helpers.CF("app", appName).Wait() + g.Expect(session).Should(Say("Rolling deployment currently CANCELING")) + g.Expect(session).Should(Exit(0)) + }).Should(Succeed()) }) }) }) @@ -292,19 +294,21 @@ applications: Eventually(helpers.CF("restart", appName, "--strategy", "canary")).Should(Exit(0)) session1 := helpers.CF("app", appName) - Eventually(session1).Should(Say("Canary deployment currently PAUSED.")) + Eventually(session1).Should(Say("Canary deployment currently PAUSED")) Eventually(session1).Should(Exit(0)) }) }) When("the deployment is cancelled after it is paused", func() { - It("no deployment information is displayed", func() { + It("displays the message", func() { Eventually(helpers.CF("restart", appName, "--strategy", "canary")).Should(Exit(0)) Eventually(helpers.CF("cancel-deployment", appName)).Should(Exit(0)) - session2 := helpers.CF("app", appName) - Eventually(session2).ShouldNot(Say("Canary deployment currently CANCELING.")) - Eventually(session2).Should(Exit(0)) + Eventually(func(g Gomega) { + session := helpers.CF("app", appName).Wait() + g.Expect(session).Should(Say("Canary deployment currently CANCELING")) + g.Expect(session).Should(Exit(0)) + }).Should(Succeed()) }) }) }) From ccfe842c81ba8c3964b6b26b3170f0748ffb1b68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 22:26:35 -0700 Subject: [PATCH 11/33] Bump k8s.io/client-go from 0.30.3 to 0.31.0 (#3106) Bumps [k8s.io/client-go](https://github.com/kubernetes/client-go) from 0.30.3 to 0.31.0. - [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes/client-go/compare/v0.30.3...v0.31.0) --- updated-dependencies: - dependency-name: k8s.io/client-go dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 20 ++++++++++---------- go.sum | 60 +++++++++++++++++++++++++++------------------------------- 2 files changed, 38 insertions(+), 42 deletions(-) diff --git a/go.mod b/go.mod index f5adcd206b6..f081664cd26 100644 --- a/go.mod +++ b/go.mod @@ -45,8 +45,8 @@ require ( golang.org/x/text v0.17.0 gopkg.in/cheggaaa/pb.v1 v1.0.28 gopkg.in/yaml.v2 v2.4.0 - k8s.io/apimachinery v0.30.3 - k8s.io/client-go v0.30.3 + k8s.io/apimachinery v0.31.0 + k8s.io/client-go v0.31.0 ) require ( @@ -57,12 +57,12 @@ require ( github.com/charlievieth/fs v0.0.3 // indirect github.com/cloudfoundry/bosh-utils v0.0.397 // indirect github.com/cppforlife/go-patch v0.1.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect @@ -77,24 +77,24 @@ require ( github.com/openzipkin/zipkin-go v0.4.2 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/x448/float16 v0.8.4 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/mod v0.20.0 // indirect - golang.org/x/oauth2 v0.17.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.24.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.24.0 // indirect - google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/go.sum b/go.sum index 8752f95a829..283ff3654fa 100644 --- a/go.sum +++ b/go.sum @@ -61,8 +61,9 @@ github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/drewolson/testflight v1.0.0/go.mod h1:t9oKuuEohRGLb80SWX+uxJHuhX98B7HnojqtW+Ryq30= @@ -74,14 +75,16 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -214,13 +217,14 @@ github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7ir github.com/pivotal-cf/brokerapi/v7 v7.2.0/go.mod h1:5QRQ8vJmav91F+AvY5NA/QoDOq70XgBVxXKUK4N/cNE= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/sabhiram/go-gitignore v0.0.0-20171017070213-362f9845770f h1:FQZgA673tRGrrXIP/OPMO69g81ow4XsKlN/DLH8pSic= github.com/sabhiram/go-gitignore v0.0.0-20171017070213-362f9845770f/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= github.com/sajari/fuzzy v1.0.0 h1:+FmwVvJErsd0d0hAPlj4CxqxUtQY/fOoY0DwX4ykpRY= @@ -248,10 +252,11 @@ github.com/tedsuo/rata v1.0.1-0.20170830210128-07d200713958/go.mod h1:X47ELzhOoL github.com/unrolled/secure v0.0.0-20180416205222-a1cf62cc2159/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.step.sm/crypto v0.51.1 h1:ktUg/2hetEMiBAqgz502ktZDGoDoGrcHFg3XpkmkvvA= go.step.sm/crypto v0.51.1/go.mod h1:PdrhttNU/tG9/YsVd4fdlysBN+UV503p0o2irFZQlAw= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -268,7 +273,6 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -286,17 +290,15 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180419222023-a2a45943ae67/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -319,9 +321,7 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -336,7 +336,6 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -350,15 +349,12 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.11-0.20220316014157-77aa08bb151a/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= @@ -376,8 +372,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -403,21 +399,21 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.4.0-0.dev/go.mod h1:vlRD9XErLMGT+mDuofSr0mMMquscM/1nQqtRSsh6m70= -k8s.io/api v0.30.3 h1:ImHwK9DCsPA9uoU3rVh4QHAHHK5dTSv1nxJUapx8hoQ= -k8s.io/api v0.30.3/go.mod h1:GPc8jlzoe5JG3pb0KJCSLX5oAFIW3/qNJITlDj8BH04= -k8s.io/apimachinery v0.30.3 h1:q1laaWCmrszyQuSQCfNB8cFgCuDAoPszKY4ucAjDwHc= -k8s.io/apimachinery v0.30.3/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= -k8s.io/client-go v0.30.3 h1:bHrJu3xQZNXIi8/MoxYtZBBWQQXwy16zqJwloXXfD3k= -k8s.io/client-go v0.30.3/go.mod h1:8d4pf8vYu665/kUbsxWAQ/JDBNWqfFeZnvFiVdmx89U= -k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= -k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo= +k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE= +k8s.io/apimachinery v0.31.0 h1:m9jOiSr3FoSSL5WO9bjm1n6B9KROYYgNZOb4tyZ1lBc= +k8s.io/apimachinery v0.31.0/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8= +k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= From 297937336736760672585180cb5a2f8189bfc65d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 19:04:34 -0700 Subject: [PATCH 12/33] Bump github.com/creack/pty from 1.1.21 to 1.1.23 (#3111) Bumps [github.com/creack/pty](https://github.com/creack/pty) from 1.1.21 to 1.1.23. - [Release notes](https://github.com/creack/pty/releases) - [Commits](https://github.com/creack/pty/compare/v1.1.21...v1.1.23) --- updated-dependencies: - dependency-name: github.com/creack/pty dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f081664cd26..168cfd21acf 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 github.com/blang/semver/v4 v4.0.0 github.com/cloudfoundry/bosh-cli v6.4.1+incompatible - github.com/creack/pty v1.1.21 + github.com/creack/pty v1.1.23 github.com/cyphar/filepath-securejoin v0.3.1 github.com/distribution/reference v0.6.0 github.com/fatih/color v1.17.0 diff --git a/go.sum b/go.sum index 283ff3654fa..e4bb71faddc 100644 --- a/go.sum +++ b/go.sum @@ -56,8 +56,8 @@ github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2 github.com/cppforlife/go-patch v0.1.0 h1:I0fT+gFTSW4xWwvaTaUUVjr9xxjNXJ4naGc01BeQjwY= github.com/cppforlife/go-patch v0.1.0/go.mod h1:67a7aIi94FHDZdoeGSJRRFDp66l9MhaAG1yGxpUoFD8= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= -github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.23 h1:4M6+isWdcStXEf15G/RbrMPOQj1dZ7HPZCGwE4kOeP0= +github.com/creack/pty v1.1.23/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= From 01492c527ba659dbc4277d705509b1f49123094e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 23:23:52 -0700 Subject: [PATCH 13/33] Bump code.cloudfoundry.org/lager/v3 from 3.0.3 to 3.1.0 (#3110) Bumps [code.cloudfoundry.org/lager/v3](https://github.com/cloudfoundry/lager) from 3.0.3 to 3.1.0. - [Release notes](https://github.com/cloudfoundry/lager/releases) - [Commits](https://github.com/cloudfoundry/lager/compare/v3.0.3...v3.1.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/lager/v3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 168cfd21acf..fd5aca56f5c 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( code.cloudfoundry.org/go-loggregator/v9 v9.2.1 code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f code.cloudfoundry.org/jsonry v1.1.4 - code.cloudfoundry.org/lager/v3 v3.0.3 + code.cloudfoundry.org/lager/v3 v3.1.0 code.cloudfoundry.org/tlsconfig v0.1.0 code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 @@ -74,11 +74,11 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/openzipkin/zipkin-go v0.4.2 // indirect + github.com/openzipkin/zipkin-go v0.4.3 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect + golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect golang.org/x/mod v0.20.0 // indirect golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/sync v0.8.0 // indirect @@ -87,7 +87,7 @@ require ( golang.org/x/tools v0.24.0 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be // indirect google.golang.org/grpc v1.63.2 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index e4bb71faddc..a525674f07f 100644 --- a/go.sum +++ b/go.sum @@ -21,8 +21,8 @@ code.cloudfoundry.org/inigo v0.0.0-20230612153013-b300679e6ed6/go.mod h1:1ZB1JCh code.cloudfoundry.org/jsonry v1.1.4 h1:P9N7IlH1/4aRCLcXLgLFj1hkcBmV7muijJzY+K6U4hE= code.cloudfoundry.org/jsonry v1.1.4/go.mod h1:6aKilShQP7w/Ez76h1El2/n9y2OkHuU56nKSBB9Gp0A= code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be/go.mod h1:O2sS7gKP3HM2iemG+EnwvyNQK7pTSC6Foi4QiMp9sSk= -code.cloudfoundry.org/lager/v3 v3.0.3 h1:/UTmadZfIaKuT/whEinSxK1mzRfNu1uPfvjFfGqiwzM= -code.cloudfoundry.org/lager/v3 v3.0.3/go.mod h1:Zn5q1SrIuuHjEUE7xerMKt3ztunrJQCZETAo7rV0CH8= +code.cloudfoundry.org/lager/v3 v3.1.0 h1:ZB4VXLSI0bIWhDSjKdEh/Jrs2SXFLX/9+z2WEZhAf2o= +code.cloudfoundry.org/lager/v3 v3.1.0/go.mod h1:5KBxqCSNJBNf/RXCindvnyAKBWxTgMMO5mtn1qkMoEM= code.cloudfoundry.org/tlsconfig v0.1.0 h1:/SGZk3K7t79cuhSVs/qZXayEnLV1kodmvU3EBcc4E4w= code.cloudfoundry.org/tlsconfig v0.1.0/go.mod h1:6ymG8DjGLta+bnqdpUmdv88Ikje2VvOTq+8drVe4pUU= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d h1:M+zXqtXJqcsmpL76aU0tdl1ho23eYa4axYoM4gD62UA= @@ -211,8 +211,8 @@ github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/openzipkin/zipkin-go v0.4.2 h1:zjqfqHjUpPmB3c1GlCvvgsM1G4LkvqQbBDueDOCg/jA= -github.com/openzipkin/zipkin-go v0.4.2/go.mod h1:ZeVkFjuuBiSy13y8vpSDCjMi9GoI3hPpCJSBx/EYFhY= +github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= +github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pivotal-cf/brokerapi/v7 v7.2.0/go.mod h1:5QRQ8vJmav91F+AvY5NA/QoDOq70XgBVxXKUK4N/cNE= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -266,8 +266,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -359,8 +359,8 @@ google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUE google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= From 835b2ca94be47df20c1f1bb0406c993c65f83cb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 09:09:36 -0700 Subject: [PATCH 14/33] Bump code.cloudfoundry.org/clock from 1.2.0 to 1.3.0 (#3114) Bumps [code.cloudfoundry.org/clock](https://github.com/cloudfoundry/clock) from 1.2.0 to 1.3.0. - [Release notes](https://github.com/cloudfoundry/clock/releases) - [Commits](https://github.com/cloudfoundry/clock/compare/v1.2.0...v1.3.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/clock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fd5aca56f5c..c9d8a90f5b3 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 - code.cloudfoundry.org/clock v1.2.0 + code.cloudfoundry.org/clock v1.3.0 code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 code.cloudfoundry.org/go-log-cache/v2 v2.0.7 code.cloudfoundry.org/go-loggregator/v9 v9.2.1 diff --git a/go.sum b/go.sum index a525674f07f..7c96aeb1464 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 h1:jaHW code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85/go.mod h1:R1EiyOAr7lW0l/YkZNqItUNZ01Q/dYUfbTn4X4Z+82M= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 h1:O+j8afQWaDuxzKGcculsjgHGK+biBTn6iMjgFpBf54c= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4/go.mod h1:dVTgo9kQbYns/QM4A1C2GtxqUnFSvJTk2Qhw+M0/uzk= -code.cloudfoundry.org/clock v1.2.0 h1:1swXS7yPmQmhAdkTb1nJ2c0geOdf4LvibUleNCo2HjA= -code.cloudfoundry.org/clock v1.2.0/go.mod h1:foDbmVp5RIuIGlota90ot4FkJtx5m4+oKoWiVuu2FDg= +code.cloudfoundry.org/clock v1.3.0 h1:0P9zWwt9eSCHYTFWSCT7FkX21x/dEDHKTlSbvJG80RI= +code.cloudfoundry.org/clock v1.3.0/go.mod h1:U4uytQbm9TLDZh+pwNaIKBINM1FIgHPQuH0IewhtNMk= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 h1:Bns1y0jSlcvfP0u8ael+TUlnyNHsNX808zuo58bf5so= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82/go.mod h1:L2/glHnSK+wKnsG8oZZqdV2sgYY9NDo/I1aDJGhcWaM= code.cloudfoundry.org/go-log-cache/v2 v2.0.7 h1:yR/JjQ/RscO1n4xVAT9HDYcpx5ET/3Cq2/RhpJml6ZU= From 9cc8acba5761310a061e6b3d091228eb0b855068 Mon Sep 17 00:00:00 2001 From: Greg Weresch Date: Mon, 19 Aug 2024 16:45:08 -0400 Subject: [PATCH 15/33] [main] Max in flight status tests (#3113) * [main] Max in flight status tests * Add copy-source tests to verify max-in-flight output * Add rollback tests to verify max-in-flight output * Add restage tests to verify max-in-flight output * Add restart tests to verify max-in-flight output * Add push tests to verify max-in-flight output * Delete a flakey integration test that has unit test coverage --- integration/v7/isolated/app_command_test.go | 14 ---- .../v7/isolated/copy_source_command_test.go | 27 ++++++- .../v7/isolated/restage_command_test.go | 23 +++++- .../v7/isolated/restart_command_test.go | 34 +++++++- .../v7/isolated/rollback_command_test.go | 26 ++++++- integration/v7/push/canary_push_test.go | 77 ++++++++++++++----- 6 files changed, 157 insertions(+), 44 deletions(-) diff --git a/integration/v7/isolated/app_command_test.go b/integration/v7/isolated/app_command_test.go index d262d96a3c6..a42377b2a50 100644 --- a/integration/v7/isolated/app_command_test.go +++ b/integration/v7/isolated/app_command_test.go @@ -272,20 +272,6 @@ applications: Eventually(session1).Should(Exit(0)) }) }) - When("the deployment is cancelled", func() { - It("displays the message", func() { - helpers.CF("restart", appName, "--strategy", "rolling") - Eventually(func() *Session { - return helpers.CF("cancel-deployment", appName).Wait() - }).Should(Exit(0)) - - Eventually(func(g Gomega) { - session := helpers.CF("app", appName).Wait() - g.Expect(session).Should(Say("Rolling deployment currently CANCELING")) - g.Expect(session).Should(Exit(0)) - }).Should(Succeed()) - }) - }) }) When("the deployment strategy is canary", func() { diff --git a/integration/v7/isolated/copy_source_command_test.go b/integration/v7/isolated/copy_source_command_test.go index bd8829140ca..e0495b4f050 100644 --- a/integration/v7/isolated/copy_source_command_test.go +++ b/integration/v7/isolated/copy_source_command_test.go @@ -374,7 +374,7 @@ var _ = Describe("copy-source command", func() { }) helpers.WithBananaPantsApp(func(appDir string) { - Eventually(helpers.CF("push", targetAppName, "--no-start", "-p", appDir, "-b", "staticfile_buildpack")).Should(Exit(0)) + Eventually(helpers.CF("push", targetAppName, "-p", appDir, "-b", "staticfile_buildpack")).Should(Exit(0)) }) }) @@ -388,9 +388,32 @@ var _ = Describe("copy-source command", func() { Eventually(session).Should(Say("Copying source from app %s to target app %s in org %s / space %s as %s...", sourceAppName, targetAppName, orgName, spaceName, username)) Eventually(session).Should(Say("Staging app %s in org %s / space %s as %s...", targetAppName, orgName, spaceName, username)) Eventually(session).Should(Say("Waiting for app to deploy...")) + Eventually(session).Should(Say("Canary deployment currently PAUSED")) + Eventually(session).ShouldNot(Say("max-in-flight")) + Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", targetAppName, targetAppName)) Eventually(session).Should(Exit(0)) - Eventually(helpers.CF("start", targetAppName)).Should(Exit(0)) + Eventually(helpers.CF("continue-deployment", targetAppName)).Should(Exit(0)) + resp, err := http.Get(fmt.Sprintf("http://%s.%s", targetAppName, helpers.DefaultSharedDomain())) + Expect(err).ToNot(HaveOccurred()) + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + Expect(err).ToNot(HaveOccurred()) + Expect(string(body)).To(MatchRegexp("hello world")) + }) + + It("displays max-in-flight when it is not the default value", func() { + username, _ := helpers.GetCredentials() + session := helpers.CF("copy-source", sourceAppName, targetAppName, "--strategy", "canary", "--max-in-flight", "2") + Eventually(session).Should(Say("Copying source from app %s to target app %s in org %s / space %s as %s...", sourceAppName, targetAppName, orgName, spaceName, username)) + Eventually(session).Should(Say("Staging app %s in org %s / space %s as %s...", targetAppName, orgName, spaceName, username)) + Eventually(session).Should(Say("Waiting for app to deploy...")) + Eventually(session).Should(Say("Canary deployment currently PAUSED")) + Eventually(session).Should(Say("max-in-flight: 2")) + Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", targetAppName, targetAppName)) + Eventually(session).Should(Exit(0)) + + Eventually(helpers.CF("continue-deployment", targetAppName)).Should(Exit(0)) resp, err := http.Get(fmt.Sprintf("http://%s.%s", targetAppName, helpers.DefaultSharedDomain())) Expect(err).ToNot(HaveOccurred()) defer resp.Body.Close() diff --git a/integration/v7/isolated/restage_command_test.go b/integration/v7/isolated/restage_command_test.go index 8f30228cc3b..458b9d2218f 100644 --- a/integration/v7/isolated/restage_command_test.go +++ b/integration/v7/isolated/restage_command_test.go @@ -231,15 +231,32 @@ applications: }) }) - When("strategy canary is given", func() { - It("restages successfully", func() { + When("strategy canary is given without the max-in-flight flag", func() { + It("restages successfully without noting max-in-flight", func() { userName, _ := helpers.GetCredentials() session := helpers.CF("restage", appName, "--strategy", "canary") Consistently(session.Err).ShouldNot(Say(`This action will cause app downtime\.`)) Eventually(session).Should(Say(`Restaging app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) Eventually(session).Should(Say(`Waiting for app to deploy\.\.\.`)) - Eventually(session).Should(Say("Canary deployment currently PAUSED.")) + Eventually(session).Should(Say("Canary deployment currently PAUSED")) + Eventually(session).ShouldNot(Say("max-in-flight")) + Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) + Eventually(session).Should(Exit(0)) + }) + }) + + When("strategy canary is given with a non-default max-in-flight value", func() { + It("restages successfully and notes the max-in-flight value", func() { + userName, _ := helpers.GetCredentials() + session := helpers.CF("restage", appName, "--strategy", "canary", "--max-in-flight", "2") + Consistently(session.Err).ShouldNot(Say(`This action will cause app downtime\.`)) + Eventually(session).Should(Say(`Restaging app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) + Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) + Eventually(session).Should(Say(`Waiting for app to deploy\.\.\.`)) + Eventually(session).Should(Say("Canary deployment currently PAUSED")) + Eventually(session).Should(Say("max-in-flight: 2")) + Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Eventually(session).Should(Exit(0)) }) }) diff --git a/integration/v7/isolated/restart_command_test.go b/integration/v7/isolated/restart_command_test.go index bd7bd8a5923..99597a37ffa 100644 --- a/integration/v7/isolated/restart_command_test.go +++ b/integration/v7/isolated/restart_command_test.go @@ -117,13 +117,13 @@ var _ = Describe("restart command", func() { }) }) - When("strategy canary is given", func() { + When("strategy canary is given without the max-in-flight flag", func() { BeforeEach(func() { helpers.WithHelloWorldApp(func(appDir string) { Eventually(helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, "push", appName)).Should(Exit(0)) }) }) - It("creates a deploy", func() { + It("creates a deploy without noting max-in-flight", func() { session := helpers.CF("restart", appName, "--strategy=canary") Eventually(session).Should(Say(`Restarting app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) @@ -136,6 +136,36 @@ var _ = Describe("restart command", func() { Eventually(session).Should(Say(`memory usage:\s+\d+(M|G)`)) Eventually(session).Should(Say(instanceStatsTitles)) Eventually(session).Should(Say(instanceStatsValues)) + Eventually(session).Should(Say("Canary deployment currently PAUSED")) + Eventually(session).ShouldNot(Say("max-in-flight")) + Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) + Eventually(session).Should(Exit(0)) + }) + }) + + When("strategy canary is given with a non-default max-in-flight value", func() { + BeforeEach(func() { + helpers.WithHelloWorldApp(func(appDir string) { + Eventually(helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, "push", appName)).Should(Exit(0)) + }) + }) + It("creates a deploy and notes the max-in-flight value", func() { + session := helpers.CF("restart", appName, "--strategy=canary", "--max-in-flight", "3") + Eventually(session).Should(Say(`Restarting app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) + Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) + Eventually(session).Should(Say(`Waiting for app to deploy\.\.\.`)) + Eventually(session).Should(Say(`name:\s+%s`, appName)) + Eventually(session).Should(Say(`requested state:\s+started`)) + Eventually(session).Should(Say(`routes:\s+%s.%s`, appName, helpers.DefaultSharedDomain())) + Eventually(session).Should(Say(`type:\s+web`)) + Eventually(session).Should(Say(`instances:\s+1/1`)) + Eventually(session).Should(Say(`memory usage:\s+\d+(M|G)`)) + Eventually(session).Should(Say(instanceStatsTitles)) + Eventually(session).Should(Say(instanceStatsValues)) + Eventually(session).Should(Say("Canary deployment currently PAUSED")) + Eventually(session).Should(Say("max-in-flight: 3")) + Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) + Eventually(session).Should(Exit(0)) }) }) diff --git a/integration/v7/isolated/rollback_command_test.go b/integration/v7/isolated/rollback_command_test.go index 3e8bf1eb0cd..7a2875a9348 100644 --- a/integration/v7/isolated/rollback_command_test.go +++ b/integration/v7/isolated/rollback_command_test.go @@ -151,18 +151,40 @@ applications: Expect(session).To(Say(`3\(deployed\)\s+New droplet deployed.`)) }) - When("the strategy flag is provided", func() { + When("the strategy flag is provided without the max-in-flight flag", func() { BeforeEach(func() { _, err := buffer.Write([]byte("y\n")) Expect(err).ToNot(HaveOccurred()) }) - It("uses the given strategy to rollback", func() { + It("uses the given strategy to rollback without noting max-in-flight", func() { session := helpers.CFWithStdin(buffer, "rollback", appName, "--version", "1", "--strategy", "canary") Eventually(session).Should(Exit(0)) Expect(session).To(HaveRollbackPrompt()) Expect(session).To(HaveRollbackOutput(appName, orgName, spaceName, userName)) + Expect(session).To(Say("Canary deployment currently PAUSED")) + Expect(session).NotTo(Say("max-in-flight")) + Expect(session).To(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) + Expect(session).To(Say("OK")) + }) + }) + + When("the strategy flag is provided with a non-default max-in-flight value", func() { + BeforeEach(func() { + _, err := buffer.Write([]byte("y\n")) + Expect(err).ToNot(HaveOccurred()) + }) + + It("uses the given strategy to rollback and notes the max-in-flight value", func() { + session := helpers.CFWithStdin(buffer, "rollback", appName, "--version", "1", "--strategy", "canary", "--max-in-flight", "2") + Eventually(session).Should(Exit(0)) + + Expect(session).To(HaveRollbackPrompt()) + Expect(session).To(HaveRollbackOutput(appName, orgName, spaceName, userName)) + Expect(session).To(Say("Canary deployment currently PAUSED")) + Expect(session).To(Say("max-in-flight: 2")) + Expect(session).To(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Expect(session).To(Say("OK")) }) }) diff --git a/integration/v7/push/canary_push_test.go b/integration/v7/push/canary_push_test.go index 4dd9a89adb7..4fcbed184ca 100644 --- a/integration/v7/push/canary_push_test.go +++ b/integration/v7/push/canary_push_test.go @@ -30,28 +30,63 @@ var _ = Describe("push with --strategy canary", func() { }) }) - It("pushes the app and creates a new deployment", func() { - helpers.WithHelloWorldApp(func(appDir string) { - session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, - PushCommandName, appName, "--strategy", "canary", - ) + When("the max-in-flight flag is not given", func() { + It("pushes the app and creates a new deployment without noting max-in-flight", func() { + helpers.WithHelloWorldApp(func(appDir string) { + session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, + PushCommandName, appName, "--strategy", "canary", + ) - Eventually(session).Should(Exit(0)) - Expect(session).To(Say(`Pushing app %s to org %s / space %s as %s\.\.\.`, appName, organization, space, userName)) - Expect(session).To(Say(`Packaging files to upload\.\.\.`)) - Expect(session).To(Say(`Uploading files\.\.\.`)) - Expect(session).To(Say(`100.00%`)) - Expect(session).To(Say(`Waiting for API to complete processing files\.\.\.`)) - Expect(session).To(Say(`Staging app and tracing logs\.\.\.`)) - Expect(session).To(Say(`Starting deployment for app %s\.\.\.`, appName)) - Expect(session).To(Say(`Waiting for app to deploy\.\.\.`)) - Expect(session).To(Say(`name:\s+%s`, appName)) - Expect(session).To(Say(`requested state:\s+started`)) - Expect(session).To(Say(`routes:\s+%s.%s`, appName, helpers.DefaultSharedDomain())) - Expect(session).To(Say(`type:\s+web`)) - Expect(session).To(Say(`start command:\s+%s`, helpers.StaticfileBuildpackStartCommand)) - Expect(session).To(Say(`#0\s+running`)) - Expect(session).To(Say(`Canary deployment currently PAUSED.`)) + Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Pushing app %s to org %s / space %s as %s\.\.\.`, appName, organization, space, userName)) + Expect(session).To(Say(`Packaging files to upload\.\.\.`)) + Expect(session).To(Say(`Uploading files\.\.\.`)) + Expect(session).To(Say(`100.00%`)) + Expect(session).To(Say(`Waiting for API to complete processing files\.\.\.`)) + Expect(session).To(Say(`Staging app and tracing logs\.\.\.`)) + Expect(session).To(Say(`Starting deployment for app %s\.\.\.`, appName)) + Expect(session).To(Say(`Waiting for app to deploy\.\.\.`)) + Expect(session).To(Say(`name:\s+%s`, appName)) + Expect(session).To(Say(`requested state:\s+started`)) + Expect(session).To(Say(`routes:\s+%s.%s`, appName, helpers.DefaultSharedDomain())) + Expect(session).To(Say(`type:\s+web`)) + Expect(session).To(Say(`start command:\s+%s`, helpers.StaticfileBuildpackStartCommand)) + Expect(session).To(Say(`#0\s+running`)) + Expect(session).To(Say(`Canary deployment currently PAUSED`)) + Expect(session).ToNot(Say("max-in-flight")) + Expect(session).To(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) + Expect(session).To(Exit(0)) + }) + }) + }) + + When("the max-in-flight flag is given with a non-default value", func() { + It("pushes the app and creates a new deployment and notes the max-in-flight value", func() { + helpers.WithHelloWorldApp(func(appDir string) { + session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, + PushCommandName, appName, "--strategy", "canary", "--max-in-flight", "2", + ) + + Eventually(session).Should(Exit(0)) + Expect(session).To(Say(`Pushing app %s to org %s / space %s as %s\.\.\.`, appName, organization, space, userName)) + Expect(session).To(Say(`Packaging files to upload\.\.\.`)) + Expect(session).To(Say(`Uploading files\.\.\.`)) + Expect(session).To(Say(`100.00%`)) + Expect(session).To(Say(`Waiting for API to complete processing files\.\.\.`)) + Expect(session).To(Say(`Staging app and tracing logs\.\.\.`)) + Expect(session).To(Say(`Starting deployment for app %s\.\.\.`, appName)) + Expect(session).To(Say(`Waiting for app to deploy\.\.\.`)) + Expect(session).To(Say(`name:\s+%s`, appName)) + Expect(session).To(Say(`requested state:\s+started`)) + Expect(session).To(Say(`routes:\s+%s.%s`, appName, helpers.DefaultSharedDomain())) + Expect(session).To(Say(`type:\s+web`)) + Expect(session).To(Say(`start command:\s+%s`, helpers.StaticfileBuildpackStartCommand)) + Expect(session).To(Say(`#0\s+running`)) + Expect(session).To(Say(`Canary deployment currently PAUSED`)) + Expect(session).To(Say("max-in-flight: 2")) + Expect(session).To(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) + Expect(session).To(Exit(0)) + }) }) }) }) From c1f3e70a3be2f4e175826f36fc22aa34404d52cf Mon Sep 17 00:00:00 2001 From: AL Berez Date: Tue, 20 Aug 2024 07:16:51 -0700 Subject: [PATCH 16/33] Bump golang to 1.22.5 (#3124) to match v8 and v7 --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index c9d8a90f5b3..fdcba82b122 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module code.cloudfoundry.org/cli -go 1.22.0 +go 1.22.5 require ( code.cloudfoundry.org/bytefmt v0.0.0-20230612151507-41ef4d1f67a4 From 39b9f3cd5aed28f48b989e508db9e64933caff4e Mon Sep 17 00:00:00 2001 From: Greg Weresch Date: Tue, 20 Aug 2024 13:28:05 -0400 Subject: [PATCH 17/33] Always show max-in-flight value for active deployments (#3121) - show deployment strategy value on its own line --- .../ccv3/constant/deployment.go | 2 - command/v7/shared/app_summary_displayer.go | 25 +++-- .../v7/shared/app_summary_displayer_test.go | 93 ++++++++----------- integration/v7/isolated/app_command_test.go | 21 +++-- .../v7/isolated/copy_source_command_test.go | 10 +- .../v7/isolated/restage_command_test.go | 12 ++- .../v7/isolated/restart_command_test.go | 12 ++- .../v7/isolated/rollback_command_test.go | 12 ++- integration/v7/push/canary_push_test.go | 12 ++- 9 files changed, 102 insertions(+), 97 deletions(-) diff --git a/api/cloudcontroller/ccv3/constant/deployment.go b/api/cloudcontroller/ccv3/constant/deployment.go index b35baa374c8..2ae6159ebb7 100644 --- a/api/cloudcontroller/ccv3/constant/deployment.go +++ b/api/cloudcontroller/ccv3/constant/deployment.go @@ -31,5 +31,3 @@ const ( DeploymentStatusValueActive DeploymentStatusValue = "ACTIVE" DeploymentStatusValueFinalized DeploymentStatusValue = "FINALIZED" ) - -const DeploymentMaxInFlightDefaultValue int = 1 diff --git a/command/v7/shared/app_summary_displayer.go b/command/v7/shared/app_summary_displayer.go index 23d9affc4e0..a111b532b72 100644 --- a/command/v7/shared/app_summary_displayer.go +++ b/command/v7/shared/app_summary_displayer.go @@ -2,6 +2,7 @@ package shared import ( "fmt" + "strconv" "strings" "time" @@ -12,8 +13,6 @@ import ( "code.cloudfoundry.org/cli/resources" "code.cloudfoundry.org/cli/util/ui" log "github.com/sirupsen/logrus" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) type AppSummaryDisplayer struct { @@ -57,7 +56,7 @@ func (display AppSummaryDisplayer) AppDisplay(summary v7action.DetailedApplicati } } - display.UI.DisplayKeyValueTable("", keyValueTable, 3) + display.UI.DisplayKeyValueTable("", keyValueTable, ui.DefaultTableSpacePadding) if summary.LifecycleType == constant.AppLifecycleTypeBuildpack { display.displayBuildpackTable(summary.CurrentDroplet.Buildpacks) @@ -150,7 +149,7 @@ func (display AppSummaryDisplayer) displayProcessTable(summary v7action.Detailed startCommandRow, } - display.UI.DisplayKeyValueTable("", keyValueTable, 3) + display.UI.DisplayKeyValueTable("", keyValueTable, ui.DefaultTableSpacePadding) if len(process.InstanceDetails) == 0 { display.UI.DisplayText("There are no running instances of this process.") @@ -163,11 +162,19 @@ func (display AppSummaryDisplayer) displayProcessTable(summary v7action.Detailed display.UI.DisplayNewline() display.UI.DisplayText(display.getDeploymentStatusText(summary)) + var maxInFlightRow []string var maxInFlight = summary.Deployment.Options.MaxInFlight - if maxInFlight > 0 && maxInFlight != constant.DeploymentMaxInFlightDefaultValue { - display.UI.DisplayText(fmt.Sprintf("max-in-flight: %d", maxInFlight)) + if maxInFlight > 0 { + maxInFlightRow = append(maxInFlightRow, display.UI.TranslateText("max-in-flight:"), strconv.Itoa(maxInFlight)) } + keyValueTable := [][]string{ + {display.UI.TranslateText("strategy:"), strings.ToLower(string(summary.Deployment.Strategy))}, + maxInFlightRow, + } + + display.UI.DisplayKeyValueTable("", keyValueTable, ui.DefaultTableSpacePadding) + if summary.Deployment.Strategy == constant.DeploymentStrategyCanary && summary.Deployment.StatusReason == constant.DeploymentStatusReasonPaused { display.UI.DisplayNewline() display.UI.DisplayText(fmt.Sprintf("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", summary.Application.Name, summary.Application.Name)) @@ -178,13 +185,11 @@ func (display AppSummaryDisplayer) displayProcessTable(summary v7action.Detailed func (display AppSummaryDisplayer) getDeploymentStatusText(summary v7action.DetailedApplicationSummary) string { var lastStatusChangeTime = display.getLastStatusChangeTime(summary) if lastStatusChangeTime != "" { - return fmt.Sprintf("%s deployment currently %s (since %s)", - cases.Title(language.English, cases.NoLower).String(string(summary.Deployment.Strategy)), + return fmt.Sprintf("Active deployment with status %s (since %s)", summary.Deployment.StatusReason, lastStatusChangeTime) } else { - return fmt.Sprintf("%s deployment currently %s.", - cases.Title(language.English, cases.NoLower).String(string(summary.Deployment.Strategy)), + return fmt.Sprintf("Active deployment with status %s.", summary.Deployment.StatusReason) } } diff --git a/command/v7/shared/app_summary_displayer_test.go b/command/v7/shared/app_summary_displayer_test.go index 6494b5956e7..5fe07877248 100644 --- a/command/v7/shared/app_summary_displayer_test.go +++ b/command/v7/shared/app_summary_displayer_test.go @@ -1,7 +1,6 @@ package shared_test import ( - "fmt" "time" "code.cloudfoundry.org/cli/actor/v7action" @@ -14,8 +13,6 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gbytes" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) var _ = Describe("app summary displayer", func() { @@ -718,11 +715,12 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`Active deployment with status DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: rolling`)) }) It("displays max-in-flight value", func() { - Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) }) }) @@ -742,11 +740,9 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) - }) - - It("does not display max-in-flight", func() { - Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + Expect(testUI.Out).To(Say(`Active deployment with status DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: rolling`)) + Expect(testUI.Out).To(Say(`max-in-flight: 1`)) }) }) @@ -763,11 +759,9 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) - }) - - It("does not display max-in-flight", func() { - Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + Expect(testUI.Out).To(Say(`Active deployment with status DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: rolling`)) + Expect(testUI.Out).ToNot(Say(`max-in-flight`)) }) }) @@ -787,12 +781,13 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING`)) + Expect(testUI.Out).To(Say(`Active deployment with status DEPLOYING`)) Expect(testUI.Out).NotTo(Say(`\(since`)) + Expect(testUI.Out).To(Say(`strategy: rolling`)) }) It("displays max-in-flight value", func() { - Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) }) }) @@ -812,12 +807,10 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Rolling deployment currently DEPLOYING`)) + Expect(testUI.Out).To(Say(`Active deployment with status DEPLOYING`)) Expect(testUI.Out).NotTo(Say(`\(since`)) - }) - - It("does not display max-in-flight", func() { - Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + Expect(testUI.Out).To(Say(`strategy: rolling`)) + Expect(testUI.Out).To(Say(`max-in-flight: 1`)) }) }) }) @@ -839,11 +832,12 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Rolling deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`Active deployment with status CANCELING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: rolling`)) }) It("displays max-in-flight value", func() { - Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) }) }) @@ -863,11 +857,9 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Rolling deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) - }) - - It("does not display max-in-flight", func() { - Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + Expect(testUI.Out).To(Say(`Active deployment with status CANCELING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: rolling`)) + Expect(testUI.Out).To(Say(`max-in-flight: 1`)) }) }) }) @@ -891,12 +883,13 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Canary deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`Active deployment with status DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: canary`)) Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) }) It("displays max-in-flight value", func() { - Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) }) }) @@ -916,12 +909,10 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Canary deployment currently DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`Active deployment with status DEPLOYING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: canary`)) Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) - }) - - It("does not display max-in-flight", func() { - Expect(testUI.Out).NotTo(Say(`max-in-flight`)) + Expect(testUI.Out).To(Say(`max-in-flight: 1`)) }) }) }) @@ -948,12 +939,13 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Canary deployment currently PAUSED \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`Active deployment with status PAUSED \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: canary`)) Expect(testUI.Out).To(Say("Please run `cf continue-deployment foobar` to promote the canary deployment, or `cf cancel-deployment foobar` to rollback to the previous version.")) }) It("displays max-in-flight value", func() { - Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) }) }) @@ -978,13 +970,11 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Canary deployment currently PAUSED \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`Active deployment with status PAUSED \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: canary`)) + Expect(testUI.Out).To(Say(`max-in-flight: 1`)) Expect(testUI.Out).To(Say("Please run `cf continue-deployment foobar` to promote the canary deployment, or `cf cancel-deployment foobar` to rollback to the previous version.")) }) - - It("does not display max-in-flight", func() { - Expect(testUI.Out).NotTo(Say(`max-in-flight`)) - }) }) }) @@ -1005,12 +995,13 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Canary deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`Active deployment with status CANCELING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: canary`)) Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) }) It("displays max-in-flight value", func() { - Expect(testUI.Out).To(Say(`max-in-flight: 2`)) + Expect(testUI.Out).To(Say(`max-in-flight: 2`)) }) }) @@ -1030,13 +1021,11 @@ var _ = Describe("app summary displayer", func() { }) It("displays the message", func() { - Expect(testUI.Out).To(Say(`Canary deployment currently CANCELING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`Active deployment with status CANCELING \(since %s\)`, dateTimeRegexPattern)) + Expect(testUI.Out).To(Say(`strategy: canary`)) + Expect(testUI.Out).To(Say(`max-in-flight: 1`)) Expect(testUI.Out).NotTo(Say(`promote the canary deployment`)) }) - - It("does not display max-in-flight", func() { - Expect(testUI.Out).NotTo(Say(`max-in-flight`)) - }) }) }) }) @@ -1054,9 +1043,7 @@ var _ = Describe("app summary displayer", func() { }) It("does not display deployment info", func() { - Expect(testUI.Out).NotTo(Say(fmt.Sprintf("%s deployment currently %s", - cases.Title(language.English, cases.NoLower).String(string(summary.Deployment.Strategy)), - summary.Deployment.StatusReason))) + Expect(testUI.Out).NotTo(Say(`Active deployment with status`)) }) It("does not display max-in-flight", func() { diff --git a/integration/v7/isolated/app_command_test.go b/integration/v7/isolated/app_command_test.go index a42377b2a50..ac3c64e990f 100644 --- a/integration/v7/isolated/app_command_test.go +++ b/integration/v7/isolated/app_command_test.go @@ -264,12 +264,15 @@ applications: When("the deployment strategy is rolling", func() { When("the deployment is in progress", func() { It("displays the message", func() { - session := helpers.CF("restart", appName, "--strategy", "rolling") + restartSession := helpers.CF("restart", appName, "--strategy", "rolling") - session1 := helpers.CF("app", appName) - Eventually(session1).Should(Say("Rolling deployment currently DEPLOYING")) - Eventually(session).Should(Exit(0)) - Eventually(session1).Should(Exit(0)) + Eventually(func(g Gomega) { + session := helpers.CF("app", appName).Wait() + g.Expect(session).Should(Say("Active deployment with status DEPLOYING")) + g.Expect(session).Should(Say("strategy: rolling")) + g.Expect(session).Should(Exit(0)) + }).Should(Succeed()) + Eventually(restartSession).Should(Exit(0)) }) }) }) @@ -280,7 +283,8 @@ applications: Eventually(helpers.CF("restart", appName, "--strategy", "canary")).Should(Exit(0)) session1 := helpers.CF("app", appName) - Eventually(session1).Should(Say("Canary deployment currently PAUSED")) + Eventually(session1).Should(Say("Active deployment with status PAUSED")) + Eventually(session1).Should(Say("strategy: canary")) Eventually(session1).Should(Exit(0)) }) }) @@ -292,7 +296,8 @@ applications: Eventually(func(g Gomega) { session := helpers.CF("app", appName).Wait() - g.Expect(session).Should(Say("Canary deployment currently CANCELING")) + g.Expect(session).Should(Say("Active deployment with status CANCELING")) + g.Expect(session).Should(Say("strategy: canary")) g.Expect(session).Should(Exit(0)) }).Should(Succeed()) }) @@ -310,7 +315,7 @@ applications: It("doesn not display the message", func() { session := helpers.CF("app", appName) Eventually(session).Should(Exit(0)) - Eventually(session).ShouldNot(Say(`\w+ deployment currently \w+`)) + Eventually(session).ShouldNot(Say(`Active deployment with status \w+`)) }) }) }) diff --git a/integration/v7/isolated/copy_source_command_test.go b/integration/v7/isolated/copy_source_command_test.go index e0495b4f050..a073cb64c9a 100644 --- a/integration/v7/isolated/copy_source_command_test.go +++ b/integration/v7/isolated/copy_source_command_test.go @@ -388,8 +388,9 @@ var _ = Describe("copy-source command", func() { Eventually(session).Should(Say("Copying source from app %s to target app %s in org %s / space %s as %s...", sourceAppName, targetAppName, orgName, spaceName, username)) Eventually(session).Should(Say("Staging app %s in org %s / space %s as %s...", targetAppName, orgName, spaceName, username)) Eventually(session).Should(Say("Waiting for app to deploy...")) - Eventually(session).Should(Say("Canary deployment currently PAUSED")) - Eventually(session).ShouldNot(Say("max-in-flight")) + Eventually(session).Should(Say("Active deployment with status PAUSED")) + Eventually(session).Should(Say("strategy: canary")) + Eventually(session).Should(Say("max-in-flight: 1")) Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", targetAppName, targetAppName)) Eventually(session).Should(Exit(0)) @@ -408,8 +409,9 @@ var _ = Describe("copy-source command", func() { Eventually(session).Should(Say("Copying source from app %s to target app %s in org %s / space %s as %s...", sourceAppName, targetAppName, orgName, spaceName, username)) Eventually(session).Should(Say("Staging app %s in org %s / space %s as %s...", targetAppName, orgName, spaceName, username)) Eventually(session).Should(Say("Waiting for app to deploy...")) - Eventually(session).Should(Say("Canary deployment currently PAUSED")) - Eventually(session).Should(Say("max-in-flight: 2")) + Eventually(session).Should(Say("Active deployment with status PAUSED")) + Eventually(session).Should(Say("strategy: canary")) + Eventually(session).Should(Say("max-in-flight: 2")) Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", targetAppName, targetAppName)) Eventually(session).Should(Exit(0)) diff --git a/integration/v7/isolated/restage_command_test.go b/integration/v7/isolated/restage_command_test.go index 458b9d2218f..3d88fcad0da 100644 --- a/integration/v7/isolated/restage_command_test.go +++ b/integration/v7/isolated/restage_command_test.go @@ -232,15 +232,16 @@ applications: }) When("strategy canary is given without the max-in-flight flag", func() { - It("restages successfully without noting max-in-flight", func() { + It("restages successfully and notes the max-in-flight value", func() { userName, _ := helpers.GetCredentials() session := helpers.CF("restage", appName, "--strategy", "canary") Consistently(session.Err).ShouldNot(Say(`This action will cause app downtime\.`)) Eventually(session).Should(Say(`Restaging app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) Eventually(session).Should(Say(`Waiting for app to deploy\.\.\.`)) - Eventually(session).Should(Say("Canary deployment currently PAUSED")) - Eventually(session).ShouldNot(Say("max-in-flight")) + Eventually(session).Should(Say("Active deployment with status PAUSED")) + Eventually(session).Should(Say("strategy: canary")) + Eventually(session).Should(Say("max-in-flight: 1")) Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Eventually(session).Should(Exit(0)) }) @@ -254,8 +255,9 @@ applications: Eventually(session).Should(Say(`Restaging app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) Eventually(session).Should(Say(`Waiting for app to deploy\.\.\.`)) - Eventually(session).Should(Say("Canary deployment currently PAUSED")) - Eventually(session).Should(Say("max-in-flight: 2")) + Eventually(session).Should(Say("Active deployment with status PAUSED")) + Eventually(session).Should(Say("strategy: canary")) + Eventually(session).Should(Say("max-in-flight: 2")) Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Eventually(session).Should(Exit(0)) }) diff --git a/integration/v7/isolated/restart_command_test.go b/integration/v7/isolated/restart_command_test.go index 99597a37ffa..f58f5e60abf 100644 --- a/integration/v7/isolated/restart_command_test.go +++ b/integration/v7/isolated/restart_command_test.go @@ -123,7 +123,7 @@ var _ = Describe("restart command", func() { Eventually(helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, "push", appName)).Should(Exit(0)) }) }) - It("creates a deploy without noting max-in-flight", func() { + It("creates a deploy and notes the max-in-flight value", func() { session := helpers.CF("restart", appName, "--strategy=canary") Eventually(session).Should(Say(`Restarting app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) Eventually(session).Should(Say(`Creating deployment for app %s\.\.\.`, appName)) @@ -136,8 +136,9 @@ var _ = Describe("restart command", func() { Eventually(session).Should(Say(`memory usage:\s+\d+(M|G)`)) Eventually(session).Should(Say(instanceStatsTitles)) Eventually(session).Should(Say(instanceStatsValues)) - Eventually(session).Should(Say("Canary deployment currently PAUSED")) - Eventually(session).ShouldNot(Say("max-in-flight")) + Eventually(session).Should(Say("Active deployment with status PAUSED")) + Eventually(session).Should(Say("strategy: canary")) + Eventually(session).Should(Say("max-in-flight: 1")) Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Eventually(session).Should(Exit(0)) }) @@ -162,8 +163,9 @@ var _ = Describe("restart command", func() { Eventually(session).Should(Say(`memory usage:\s+\d+(M|G)`)) Eventually(session).Should(Say(instanceStatsTitles)) Eventually(session).Should(Say(instanceStatsValues)) - Eventually(session).Should(Say("Canary deployment currently PAUSED")) - Eventually(session).Should(Say("max-in-flight: 3")) + Eventually(session).Should(Say("Active deployment with status PAUSED")) + Eventually(session).Should(Say("strategy: canary")) + Eventually(session).Should(Say("max-in-flight: 3")) Eventually(session).Should(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Eventually(session).Should(Exit(0)) }) diff --git a/integration/v7/isolated/rollback_command_test.go b/integration/v7/isolated/rollback_command_test.go index 7a2875a9348..e8c1b6c9431 100644 --- a/integration/v7/isolated/rollback_command_test.go +++ b/integration/v7/isolated/rollback_command_test.go @@ -157,14 +157,15 @@ applications: Expect(err).ToNot(HaveOccurred()) }) - It("uses the given strategy to rollback without noting max-in-flight", func() { + It("uses the given strategy to rollback and notes the max-in-flight value", func() { session := helpers.CFWithStdin(buffer, "rollback", appName, "--version", "1", "--strategy", "canary") Eventually(session).Should(Exit(0)) Expect(session).To(HaveRollbackPrompt()) Expect(session).To(HaveRollbackOutput(appName, orgName, spaceName, userName)) - Expect(session).To(Say("Canary deployment currently PAUSED")) - Expect(session).NotTo(Say("max-in-flight")) + Expect(session).To(Say("Active deployment with status PAUSED")) + Expect(session).To(Say("strategy: canary")) + Expect(session).To(Say("max-in-flight: 1")) Expect(session).To(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Expect(session).To(Say("OK")) }) @@ -182,8 +183,9 @@ applications: Expect(session).To(HaveRollbackPrompt()) Expect(session).To(HaveRollbackOutput(appName, orgName, spaceName, userName)) - Expect(session).To(Say("Canary deployment currently PAUSED")) - Expect(session).To(Say("max-in-flight: 2")) + Expect(session).To(Say("Active deployment with status PAUSED")) + Expect(session).To(Say("strategy: canary")) + Expect(session).To(Say("max-in-flight: 2")) Expect(session).To(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Expect(session).To(Say("OK")) }) diff --git a/integration/v7/push/canary_push_test.go b/integration/v7/push/canary_push_test.go index 4fcbed184ca..58a9e5cf589 100644 --- a/integration/v7/push/canary_push_test.go +++ b/integration/v7/push/canary_push_test.go @@ -31,7 +31,7 @@ var _ = Describe("push with --strategy canary", func() { }) When("the max-in-flight flag is not given", func() { - It("pushes the app and creates a new deployment without noting max-in-flight", func() { + It("pushes the app and creates a new deployment and notes the max-in-flight value", func() { helpers.WithHelloWorldApp(func(appDir string) { session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: appDir}, PushCommandName, appName, "--strategy", "canary", @@ -52,8 +52,9 @@ var _ = Describe("push with --strategy canary", func() { Expect(session).To(Say(`type:\s+web`)) Expect(session).To(Say(`start command:\s+%s`, helpers.StaticfileBuildpackStartCommand)) Expect(session).To(Say(`#0\s+running`)) - Expect(session).To(Say(`Canary deployment currently PAUSED`)) - Expect(session).ToNot(Say("max-in-flight")) + Expect(session).To(Say("Active deployment with status PAUSED")) + Expect(session).To(Say("strategy: canary")) + Expect(session).To(Say("max-in-flight: 1")) Expect(session).To(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Expect(session).To(Exit(0)) }) @@ -82,8 +83,9 @@ var _ = Describe("push with --strategy canary", func() { Expect(session).To(Say(`type:\s+web`)) Expect(session).To(Say(`start command:\s+%s`, helpers.StaticfileBuildpackStartCommand)) Expect(session).To(Say(`#0\s+running`)) - Expect(session).To(Say(`Canary deployment currently PAUSED`)) - Expect(session).To(Say("max-in-flight: 2")) + Expect(session).To(Say("Active deployment with status PAUSED")) + Expect(session).To(Say("strategy: canary")) + Expect(session).To(Say("max-in-flight: 2")) Expect(session).To(Say("Please run `cf continue-deployment %s` to promote the canary deployment, or `cf cancel-deployment %s` to rollback to the previous version.", appName, appName)) Expect(session).To(Exit(0)) }) From 84a04c29f9a18a2f8f4f189366704974166411d7 Mon Sep 17 00:00:00 2001 From: Michael Chinigo Date: Wed, 21 Aug 2024 09:33:02 -0400 Subject: [PATCH 18/33] Support the --no-wait flag for `cf continue-deployment` [main] (#3123) * Support the --no-wait flag for `cf continue-deployment` * Update assertion on `cf continue-deployment` help text --- command/v7/continue_deployment_command.go | 5 +-- .../v7/continue_deployment_command_test.go | 33 ++++++++++++++++++- .../v7/isolated/continue_deployment_test.go | 6 +++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/command/v7/continue_deployment_command.go b/command/v7/continue_deployment_command.go index cfd5530080e..135cdbe978a 100644 --- a/command/v7/continue_deployment_command.go +++ b/command/v7/continue_deployment_command.go @@ -9,7 +9,8 @@ type ContinueDeploymentCommand struct { BaseCommand RequiredArgs flag.AppName `positional-args:"yes"` - usage interface{} `usage:"CF_NAME continue-deployment APP_NAME\n\nEXAMPLES:\n cf continue-deployment my-app"` + NoWait bool `long:"no-wait" description:"Exit when the first instance of the web process is healthy"` + usage interface{} `usage:"CF_NAME continue-deployment APP_NAME [--no-wait]\n\nEXAMPLES:\n cf continue-deployment my-app"` relatedCommands interface{} `related_commands:"app, push"` } @@ -58,7 +59,7 @@ func (cmd *ContinueDeploymentCommand) Execute(args []string) error { cmd.UI.DisplayText(instanceDetails) } - warnings, err = cmd.Actor.PollStartForDeployment(application, deployment.GUID, false, handleInstanceDetails) + warnings, err = cmd.Actor.PollStartForDeployment(application, deployment.GUID, cmd.NoWait, handleInstanceDetails) cmd.UI.DisplayNewline() cmd.UI.DisplayWarnings(warnings) if err != nil { diff --git a/command/v7/continue_deployment_command_test.go b/command/v7/continue_deployment_command_test.go index a5086c5c9bb..66ce4535f91 100644 --- a/command/v7/continue_deployment_command_test.go +++ b/command/v7/continue_deployment_command_test.go @@ -28,6 +28,7 @@ var _ = Describe("Continue deployment command", func() { fakeActor *v7fakes.FakeActor binaryName string appName string + noWait bool spaceGUID string executeErr error ) @@ -44,6 +45,7 @@ var _ = Describe("Continue deployment command", func() { cmd = ContinueDeploymentCommand{ RequiredArgs: flag.AppName{AppName: appName}, + NoWait: noWait, BaseCommand: BaseCommand{ UI: testUI, Config: fakeConfig, @@ -126,10 +128,13 @@ var _ = Describe("Continue deployment command", func() { When("getting the app succeeds", func() { var appGUID string + var returnedApplication resources.Application + BeforeEach(func() { appGUID = "some-app-guid" + returnedApplication = resources.Application{Name: appName, GUID: appGUID} fakeActor.GetApplicationByNameAndSpaceReturns( - resources.Application{Name: appName, GUID: appGUID}, + returnedApplication, v7action.Warnings{"get-app-warning"}, nil, ) @@ -202,6 +207,32 @@ var _ = Describe("Continue deployment command", func() { Expect(executeErr).ToNot(HaveOccurred()) }) + When("the --no-wait flag is not provided", func() { + It("polls and waits", func() { + Expect(fakeActor.PollStartForDeploymentCallCount()).To(Equal(1)) + + invokedApplication, invokedGuid, invokedNoWait, _ := fakeActor.PollStartForDeploymentArgsForCall(0) + Expect(invokedApplication).To(Equal(returnedApplication)) + Expect(invokedGuid).To(Equal(deploymentGUID)) + Expect(invokedNoWait).To(Equal(false)) + }) + }) + + When("the --no-wait flag is provided", func() { + BeforeEach(func() { + cmd.NoWait = true + }) + + It("polls without waiting", func() { + Expect(fakeActor.PollStartForDeploymentCallCount()).To(Equal(1)) + + invokedApplication, invokedGuid, invokedNoWait, _ := fakeActor.PollStartForDeploymentArgsForCall(0) + Expect(invokedApplication).To(Equal(returnedApplication)) + Expect(invokedGuid).To(Equal(deploymentGUID)) + Expect(invokedNoWait).To(Equal(true)) + }) + }) + When("polling the application fails", func() { BeforeEach(func() { fakeActor.PollStartForDeploymentReturns( diff --git a/integration/v7/isolated/continue_deployment_test.go b/integration/v7/isolated/continue_deployment_test.go index 4c1bf73370e..29f0362363a 100644 --- a/integration/v7/isolated/continue_deployment_test.go +++ b/integration/v7/isolated/continue_deployment_test.go @@ -28,13 +28,17 @@ var _ = Describe("Continue Deployment", func() { Eventually(session).Should(Say(`\n`)) Eventually(session).Should(Say(`USAGE:`)) - Eventually(session).Should(Say(`cf continue-deployment APP_NAME\n`)) + Eventually(session).Should(Say(`cf continue-deployment APP_NAME \[--no-wait\]\n`)) Eventually(session).Should(Say(`\n`)) Eventually(session).Should(Say(`EXAMPLES:`)) Eventually(session).Should(Say(`cf continue-deployment my-app\n`)) Eventually(session).Should(Say(`\n`)) + Eventually(session).Should(Say(`OPTIONS:`)) + Eventually(session).Should(Say(`--no-wait\s+Exit when the first instance of the web process is healthy`)) + Eventually(session).Should(Say(`\n`)) + Eventually(session).Should(Say(`SEE ALSO:`)) Eventually(session).Should(Say(`app, push`)) From 00775a2809364c6278c921a6d25a656bb7ffb7b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 09:40:42 -0400 Subject: [PATCH 19/33] Bump code.cloudfoundry.org/bytefmt (#3115) Bumps [code.cloudfoundry.org/bytefmt](https://github.com/cloudfoundry/bytefmt) from 0.0.0-20230612151507-41ef4d1f67a4 to 0.1.0. - [Release notes](https://github.com/cloudfoundry/bytefmt/releases) - [Commits](https://github.com/cloudfoundry/bytefmt/commits/v0.1.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/bytefmt dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fdcba82b122..9b790f25e27 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module code.cloudfoundry.org/cli go 1.22.5 require ( - code.cloudfoundry.org/bytefmt v0.0.0-20230612151507-41ef4d1f67a4 + code.cloudfoundry.org/bytefmt v0.1.0 code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 diff --git a/go.sum b/go.sum index 7c96aeb1464..036da14f42a 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -code.cloudfoundry.org/bytefmt v0.0.0-20230612151507-41ef4d1f67a4 h1:9G5F8zgma5v0GdDvNz6iZwwJp3RS/z0SY/aHGfVwvTo= -code.cloudfoundry.org/bytefmt v0.0.0-20230612151507-41ef4d1f67a4/go.mod h1:wYHCXH/gI19ujoFVuMkY48qPpPCoHLKBKXPkn67h/Yc= +code.cloudfoundry.org/bytefmt v0.1.0 h1:NmVhaUPBO59QQpt5vwYW8crDUksCnvTCQi+Q6uOeLwM= +code.cloudfoundry.org/bytefmt v0.1.0/go.mod h1:eF2ZbltNI7Pv+8Cuyeksu9up5FN5konuH0trDJBuscw= code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 h1:Yc9r1p21kEpni9WlG4mwOZw87TB2QlyS9sAEebZ3+ak= code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6/go.mod h1:u5FovqC5GGAEbFPz+IdjycDA+gIjhUwqxnu0vbHwVeM= code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 h1:jaHWw9opYjKPrDT19uydBBWSxl+g5F4Hv030fqMsalo= From cabb448f00878192bd8ec17b55309368610b7361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 22 Aug 2024 09:04:25 -0500 Subject: [PATCH 20/33] change WaitGroup to mutex (#3099) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: João Pereira --- cf/commands/application/start_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cf/commands/application/start_test.go b/cf/commands/application/start_test.go index fddba65a4ff..9ed242e6203 100644 --- a/cf/commands/application/start_test.go +++ b/cf/commands/application/start_test.go @@ -152,8 +152,8 @@ var _ = Describe("start command", func() { logRepo = new(logsfakes.FakeRepository) logMessages.Store([]logs.Loggable{}) - closeWait := sync.WaitGroup{} - closeWait.Add(1) + m := sync.Mutex{} + m.Lock() logRepo.TailLogsForStub = func(appGUID string, onConnect func(), logChan chan<- logs.Loggable, errChan chan<- error) { onConnect() @@ -163,13 +163,13 @@ var _ = Describe("start command", func() { logChan <- log } - closeWait.Wait() + m.Lock() close(logChan) }() } logRepo.CloseStub = func() { - closeWait.Done() + m.Unlock() } }) From 56ed6cd44f8567e8a5768e873fa9e7a3ad030a24 Mon Sep 17 00:00:00 2001 From: Shwetha Gururaj Date: Thu, 22 Aug 2024 11:09:06 -0400 Subject: [PATCH 21/33] Update help message for restart-app-instance command (#3127) --- command/common/command_list_v7.go | 2 +- integration/v7/isolated/restart_app_instance_command_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/command/common/command_list_v7.go b/command/common/command_list_v7.go index d1e86445932..f752d224aed 100644 --- a/command/common/command_list_v7.go +++ b/command/common/command_list_v7.go @@ -125,7 +125,7 @@ type commandList struct { Rollback v7.RollbackCommand `command:"rollback" description:"Rollback to the specified revision of an app"` StagePackage v7.StagePackageCommand `command:"stage-package" alias:"stage" description:"Stage a package into a droplet"` Restart v7.RestartCommand `command:"restart" alias:"rs" description:"Stop all instances of the app, then start them again."` - RestartAppInstance v7.RestartAppInstanceCommand `command:"restart-app-instance" description:"Terminate, then instantiate an app instance"` + RestartAppInstance v7.RestartAppInstanceCommand `command:"restart-app-instance" description:"Stop, then start application instance without updating application environment"` RouterGroups v7.RouterGroupsCommand `command:"router-groups" description:"List router groups"` Route v7.RouteCommand `command:"route" alias:"ro" description:"Display route details and mapped destinations"` Routes v7.RoutesCommand `command:"routes" alias:"r" description:"List all routes in the current space or the current organization"` diff --git a/integration/v7/isolated/restart_app_instance_command_test.go b/integration/v7/isolated/restart_app_instance_command_test.go index 0958599b94a..ce1a1f5ebfb 100644 --- a/integration/v7/isolated/restart_app_instance_command_test.go +++ b/integration/v7/isolated/restart_app_instance_command_test.go @@ -30,13 +30,13 @@ var _ = Describe("restart-app-instance command", func() { It("appears in cf help -a", func() { session := helpers.CF("help", "-a") Eventually(session).Should(Exit(0)) - Expect(session).To(HaveCommandInCategoryWithDescription("restart-app-instance", "APPS", "Terminate, then instantiate an app instance")) + Expect(session).To(HaveCommandInCategoryWithDescription("restart-app-instance", "APPS", "Stop, then start application instance without updating application environment")) }) It("Displays command usage to output", func() { session := helpers.CF("restart-app-instance", "--help") Eventually(session).Should(Say("NAME:")) - Eventually(session).Should(Say("restart-app-instance - Terminate, then instantiate an app instance")) + Eventually(session).Should(Say("restart-app-instance - Stop, then start application instance without updating application environment")) Eventually(session).Should(Say("USAGE:")) Eventually(session).Should(Say(`cf restart-app-instance APP_NAME INDEX [--process PROCESS]`)) Eventually(session).Should(Say(`OPTIONS:`)) From a8a797ee99040878ab5a3fad0157b75cf12fd162 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Aug 2024 18:41:18 -0700 Subject: [PATCH 22/33] Bump github.com/onsi/ginkgo/v2 from 2.20.0 to 2.20.1 (#3129) Bumps [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) from 2.20.0 to 2.20.1. - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.20.0...v2.20.1) --- updated-dependencies: - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9b790f25e27..f40b4fd357a 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 github.com/moby/term v0.5.0 github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d - github.com/onsi/ginkgo/v2 v2.20.0 + github.com/onsi/ginkgo/v2 v2.20.1 github.com/onsi/gomega v1.34.1 github.com/pkg/errors v0.9.1 github.com/sabhiram/go-gitignore v0.0.0-20171017070213-362f9845770f diff --git a/go.sum b/go.sum index 036da14f42a..912446eae88 100644 --- a/go.sum +++ b/go.sum @@ -197,8 +197,8 @@ github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw= -github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= +github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo= +github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= github.com/onsi/gomega v0.0.0-20171105031654-1eecca0ba8e6/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= From 0b3a82a553a5a05fb3de384809a99b058aa30b40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 17:44:24 -0700 Subject: [PATCH 23/33] Bump code.cloudfoundry.org/clock from 1.3.0 to 1.4.0 (#3135) Bumps [code.cloudfoundry.org/clock](https://github.com/cloudfoundry/clock) from 1.3.0 to 1.4.0. - [Release notes](https://github.com/cloudfoundry/clock/releases) - [Commits](https://github.com/cloudfoundry/clock/compare/v1.3.0...v1.4.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/clock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index f40b4fd357a..1bc27993466 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 - code.cloudfoundry.org/clock v1.3.0 + code.cloudfoundry.org/clock v1.4.0 code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 code.cloudfoundry.org/go-log-cache/v2 v2.0.7 code.cloudfoundry.org/go-loggregator/v9 v9.2.1 @@ -78,7 +78,7 @@ require ( github.com/rivo/uniseg v0.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect - golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect + golang.org/x/exp v0.0.0-20240822175202-778ce7bba035 // indirect golang.org/x/mod v0.20.0 // indirect golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/sync v0.8.0 // indirect diff --git a/go.sum b/go.sum index 912446eae88..824c237dd72 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 h1:jaHW code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85/go.mod h1:R1EiyOAr7lW0l/YkZNqItUNZ01Q/dYUfbTn4X4Z+82M= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 h1:O+j8afQWaDuxzKGcculsjgHGK+biBTn6iMjgFpBf54c= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4/go.mod h1:dVTgo9kQbYns/QM4A1C2GtxqUnFSvJTk2Qhw+M0/uzk= -code.cloudfoundry.org/clock v1.3.0 h1:0P9zWwt9eSCHYTFWSCT7FkX21x/dEDHKTlSbvJG80RI= -code.cloudfoundry.org/clock v1.3.0/go.mod h1:U4uytQbm9TLDZh+pwNaIKBINM1FIgHPQuH0IewhtNMk= +code.cloudfoundry.org/clock v1.4.0 h1:yzDh3Zji/fvxQCxwpvtJOo8NhXLLw9ikInoWrhYiFTE= +code.cloudfoundry.org/clock v1.4.0/go.mod h1:MCgDYOoZzZIIxNtWLf2A8/2vV+6d0tCcmAK8y9yNkqg= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 h1:Bns1y0jSlcvfP0u8ael+TUlnyNHsNX808zuo58bf5so= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82/go.mod h1:L2/glHnSK+wKnsG8oZZqdV2sgYY9NDo/I1aDJGhcWaM= code.cloudfoundry.org/go-log-cache/v2 v2.0.7 h1:yR/JjQ/RscO1n4xVAT9HDYcpx5ET/3Cq2/RhpJml6ZU= @@ -266,8 +266,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= -golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= -golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= +golang.org/x/exp v0.0.0-20240822175202-778ce7bba035 h1:VkSUcpKXdGwUpn/JsiWXwSNnIJVXRfMA4ThL5vwljWg= +golang.org/x/exp v0.0.0-20240822175202-778ce7bba035/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= From dc62c1430fc12a310da82b1305ee714e99dc33a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 17:44:54 -0700 Subject: [PATCH 24/33] Bump code.cloudfoundry.org/lager/v3 from 3.1.0 to 3.2.0 (#3136) Bumps [code.cloudfoundry.org/lager/v3](https://github.com/cloudfoundry/lager) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/cloudfoundry/lager/releases) - [Commits](https://github.com/cloudfoundry/lager/compare/v3.1.0...v3.2.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/lager/v3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1bc27993466..3fb45f8c69f 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( code.cloudfoundry.org/go-loggregator/v9 v9.2.1 code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f code.cloudfoundry.org/jsonry v1.1.4 - code.cloudfoundry.org/lager/v3 v3.1.0 + code.cloudfoundry.org/lager/v3 v3.2.0 code.cloudfoundry.org/tlsconfig v0.1.0 code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 diff --git a/go.sum b/go.sum index 824c237dd72..b5b38b0fc3d 100644 --- a/go.sum +++ b/go.sum @@ -21,8 +21,8 @@ code.cloudfoundry.org/inigo v0.0.0-20230612153013-b300679e6ed6/go.mod h1:1ZB1JCh code.cloudfoundry.org/jsonry v1.1.4 h1:P9N7IlH1/4aRCLcXLgLFj1hkcBmV7muijJzY+K6U4hE= code.cloudfoundry.org/jsonry v1.1.4/go.mod h1:6aKilShQP7w/Ez76h1El2/n9y2OkHuU56nKSBB9Gp0A= code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be/go.mod h1:O2sS7gKP3HM2iemG+EnwvyNQK7pTSC6Foi4QiMp9sSk= -code.cloudfoundry.org/lager/v3 v3.1.0 h1:ZB4VXLSI0bIWhDSjKdEh/Jrs2SXFLX/9+z2WEZhAf2o= -code.cloudfoundry.org/lager/v3 v3.1.0/go.mod h1:5KBxqCSNJBNf/RXCindvnyAKBWxTgMMO5mtn1qkMoEM= +code.cloudfoundry.org/lager/v3 v3.2.0 h1:TAl3oqpJf5fsRQo0eYtgE6SiuBL16q0Kgl7N20twLkE= +code.cloudfoundry.org/lager/v3 v3.2.0/go.mod h1:LWbn857OBghV0DtBvyocmnk+OMUG1wPNxAEwlGYfFCI= code.cloudfoundry.org/tlsconfig v0.1.0 h1:/SGZk3K7t79cuhSVs/qZXayEnLV1kodmvU3EBcc4E4w= code.cloudfoundry.org/tlsconfig v0.1.0/go.mod h1:6ymG8DjGLta+bnqdpUmdv88Ikje2VvOTq+8drVe4pUU= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d h1:M+zXqtXJqcsmpL76aU0tdl1ho23eYa4axYoM4gD62UA= From d29735cb1651f95684ad8eb9a7fae912a48f3212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 26 Aug 2024 12:36:15 -0500 Subject: [PATCH 25/33] Fix linter task (#3132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: João Pereira --- .github/workflows/golangci-lint.yml | 2 +- integration/v7/isolated/app_command_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index f1acf264d1d..88b0b530f53 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -53,4 +53,4 @@ jobs: go-version-file: go.mod check-latest: true - name: Run go fmt - run: go fmt && git diff --exit-code + run: make format && git diff --exit-code diff --git a/integration/v7/isolated/app_command_test.go b/integration/v7/isolated/app_command_test.go index ac3c64e990f..b7383f57adb 100644 --- a/integration/v7/isolated/app_command_test.go +++ b/integration/v7/isolated/app_command_test.go @@ -271,7 +271,7 @@ applications: g.Expect(session).Should(Say("Active deployment with status DEPLOYING")) g.Expect(session).Should(Say("strategy: rolling")) g.Expect(session).Should(Exit(0)) - }).Should(Succeed()) + }).Should(Succeed()) Eventually(restartSession).Should(Exit(0)) }) }) @@ -299,7 +299,7 @@ applications: g.Expect(session).Should(Say("Active deployment with status CANCELING")) g.Expect(session).Should(Say("strategy: canary")) g.Expect(session).Should(Exit(0)) - }).Should(Succeed()) + }).Should(Succeed()) }) }) }) From 4546ec41b737e3bdd4361abf04c76e85376a11b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 13:40:25 -0400 Subject: [PATCH 26/33] Bump code.cloudfoundry.org/clock from 1.4.0 to 1.5.0 (#3143) Bumps [code.cloudfoundry.org/clock](https://github.com/cloudfoundry/clock) from 1.4.0 to 1.5.0. - [Release notes](https://github.com/cloudfoundry/clock/releases) - [Commits](https://github.com/cloudfoundry/clock/compare/v1.4.0...v1.5.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/clock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 3fb45f8c69f..4b37261a623 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 - code.cloudfoundry.org/clock v1.4.0 + code.cloudfoundry.org/clock v1.5.0 code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 code.cloudfoundry.org/go-log-cache/v2 v2.0.7 code.cloudfoundry.org/go-loggregator/v9 v9.2.1 @@ -78,7 +78,7 @@ require ( github.com/rivo/uniseg v0.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect - golang.org/x/exp v0.0.0-20240822175202-778ce7bba035 // indirect + golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 // indirect golang.org/x/mod v0.20.0 // indirect golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/sync v0.8.0 // indirect diff --git a/go.sum b/go.sum index b5b38b0fc3d..6c693f6dc0e 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 h1:jaHW code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85/go.mod h1:R1EiyOAr7lW0l/YkZNqItUNZ01Q/dYUfbTn4X4Z+82M= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 h1:O+j8afQWaDuxzKGcculsjgHGK+biBTn6iMjgFpBf54c= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4/go.mod h1:dVTgo9kQbYns/QM4A1C2GtxqUnFSvJTk2Qhw+M0/uzk= -code.cloudfoundry.org/clock v1.4.0 h1:yzDh3Zji/fvxQCxwpvtJOo8NhXLLw9ikInoWrhYiFTE= -code.cloudfoundry.org/clock v1.4.0/go.mod h1:MCgDYOoZzZIIxNtWLf2A8/2vV+6d0tCcmAK8y9yNkqg= +code.cloudfoundry.org/clock v1.5.0 h1:DqbjErrmxd4xSG0SnNS88H0ZGAEhvwSpuz9PAcwN+WI= +code.cloudfoundry.org/clock v1.5.0/go.mod h1:gnsFuUrMa8XObf4sePcSjaCrxzupeipZrfG7arAS5CY= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 h1:Bns1y0jSlcvfP0u8ael+TUlnyNHsNX808zuo58bf5so= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82/go.mod h1:L2/glHnSK+wKnsG8oZZqdV2sgYY9NDo/I1aDJGhcWaM= code.cloudfoundry.org/go-log-cache/v2 v2.0.7 h1:yR/JjQ/RscO1n4xVAT9HDYcpx5ET/3Cq2/RhpJml6ZU= @@ -266,8 +266,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= -golang.org/x/exp v0.0.0-20240822175202-778ce7bba035 h1:VkSUcpKXdGwUpn/JsiWXwSNnIJVXRfMA4ThL5vwljWg= -golang.org/x/exp v0.0.0-20240822175202-778ce7bba035/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= From b580d966afb7d34016e6328928aa00f8c1cab95e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 13:40:54 -0400 Subject: [PATCH 27/33] Bump code.cloudfoundry.org/lager/v3 from 3.2.0 to 3.3.0 (#3144) Bumps [code.cloudfoundry.org/lager/v3](https://github.com/cloudfoundry/lager) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/cloudfoundry/lager/releases) - [Commits](https://github.com/cloudfoundry/lager/compare/v3.2.0...v3.3.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/lager/v3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4b37261a623..cee042da72b 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( code.cloudfoundry.org/go-loggregator/v9 v9.2.1 code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f code.cloudfoundry.org/jsonry v1.1.4 - code.cloudfoundry.org/lager/v3 v3.2.0 + code.cloudfoundry.org/lager/v3 v3.3.0 code.cloudfoundry.org/tlsconfig v0.1.0 code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 diff --git a/go.sum b/go.sum index 6c693f6dc0e..906c32511c1 100644 --- a/go.sum +++ b/go.sum @@ -21,8 +21,8 @@ code.cloudfoundry.org/inigo v0.0.0-20230612153013-b300679e6ed6/go.mod h1:1ZB1JCh code.cloudfoundry.org/jsonry v1.1.4 h1:P9N7IlH1/4aRCLcXLgLFj1hkcBmV7muijJzY+K6U4hE= code.cloudfoundry.org/jsonry v1.1.4/go.mod h1:6aKilShQP7w/Ez76h1El2/n9y2OkHuU56nKSBB9Gp0A= code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be/go.mod h1:O2sS7gKP3HM2iemG+EnwvyNQK7pTSC6Foi4QiMp9sSk= -code.cloudfoundry.org/lager/v3 v3.2.0 h1:TAl3oqpJf5fsRQo0eYtgE6SiuBL16q0Kgl7N20twLkE= -code.cloudfoundry.org/lager/v3 v3.2.0/go.mod h1:LWbn857OBghV0DtBvyocmnk+OMUG1wPNxAEwlGYfFCI= +code.cloudfoundry.org/lager/v3 v3.3.0 h1:adWGo2aBLpHVfUG+3D2FQ4B6Mf2Bcz47KITbn8V4b0k= +code.cloudfoundry.org/lager/v3 v3.3.0/go.mod h1:k/AYgZTVrwQaneNfQ2EwnZxUb9iUFE7i6AJ3KVOtAdE= code.cloudfoundry.org/tlsconfig v0.1.0 h1:/SGZk3K7t79cuhSVs/qZXayEnLV1kodmvU3EBcc4E4w= code.cloudfoundry.org/tlsconfig v0.1.0/go.mod h1:6ymG8DjGLta+bnqdpUmdv88Ikje2VvOTq+8drVe4pUU= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d h1:M+zXqtXJqcsmpL76aU0tdl1ho23eYa4axYoM4gD62UA= From 7497781359b2cc60ff745286f6d863ee06bfdbdb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:32:59 -0700 Subject: [PATCH 28/33] Bump code.cloudfoundry.org/clock from 1.5.0 to 1.7.0 (#3160) Bumps [code.cloudfoundry.org/clock](https://github.com/cloudfoundry/clock) from 1.5.0 to 1.7.0. - [Release notes](https://github.com/cloudfoundry/clock/releases) - [Commits](https://github.com/cloudfoundry/clock/compare/v1.5.0...v1.7.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/clock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 9 ++++----- go.sum | 18 ++++++++---------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index cee042da72b..4796fddbddd 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 - code.cloudfoundry.org/clock v1.5.0 + code.cloudfoundry.org/clock v1.7.0 code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 code.cloudfoundry.org/go-log-cache/v2 v2.0.7 code.cloudfoundry.org/go-loggregator/v9 v9.2.1 @@ -31,8 +31,8 @@ require ( github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 github.com/moby/term v0.5.0 github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d - github.com/onsi/ginkgo/v2 v2.20.1 - github.com/onsi/gomega v1.34.1 + github.com/onsi/ginkgo/v2 v2.20.2 + github.com/onsi/gomega v1.34.2 github.com/pkg/errors v0.9.1 github.com/sabhiram/go-gitignore v0.0.0-20171017070213-362f9845770f github.com/sajari/fuzzy v1.0.0 @@ -65,7 +65,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect + github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/imdario/mergo v0.3.6 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -78,7 +78,6 @@ require ( github.com/rivo/uniseg v0.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect - golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 // indirect golang.org/x/mod v0.20.0 // indirect golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/sync v0.8.0 // indirect diff --git a/go.sum b/go.sum index 906c32511c1..5e34f1d05d9 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 h1:jaHW code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85/go.mod h1:R1EiyOAr7lW0l/YkZNqItUNZ01Q/dYUfbTn4X4Z+82M= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 h1:O+j8afQWaDuxzKGcculsjgHGK+biBTn6iMjgFpBf54c= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4/go.mod h1:dVTgo9kQbYns/QM4A1C2GtxqUnFSvJTk2Qhw+M0/uzk= -code.cloudfoundry.org/clock v1.5.0 h1:DqbjErrmxd4xSG0SnNS88H0ZGAEhvwSpuz9PAcwN+WI= -code.cloudfoundry.org/clock v1.5.0/go.mod h1:gnsFuUrMa8XObf4sePcSjaCrxzupeipZrfG7arAS5CY= +code.cloudfoundry.org/clock v1.7.0 h1:A2owBjfo13HeyhVpLQMmU8C7u4iAMa4c5UFdB07kp40= +code.cloudfoundry.org/clock v1.7.0/go.mod h1:yMFU8B9HnZCRlTpVUxpf83iwXEisrXbYnRKZxR08r6I= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 h1:Bns1y0jSlcvfP0u8ael+TUlnyNHsNX808zuo58bf5so= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82/go.mod h1:L2/glHnSK+wKnsG8oZZqdV2sgYY9NDo/I1aDJGhcWaM= code.cloudfoundry.org/go-log-cache/v2 v2.0.7 h1:yR/JjQ/RscO1n4xVAT9HDYcpx5ET/3Cq2/RhpJml6ZU= @@ -124,8 +124,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA= +github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -197,8 +197,8 @@ github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo= -github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= +github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4= +github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag= github.com/onsi/gomega v0.0.0-20171105031654-1eecca0ba8e6/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -207,8 +207,8 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= @@ -266,8 +266,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= -golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= -golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= From 33cd63b0b54e95c7000f69cc54bb7666e6e59922 Mon Sep 17 00:00:00 2001 From: Shwetha Gururaj Date: Fri, 30 Aug 2024 11:15:41 -0400 Subject: [PATCH 29/33] Bump stack from cflinuxfs3 to cflinuxfs4 (#3155) Use CAPI release version var Remove min CAPI jobs Move ops-files from cli-ci to this repo --- .github/ops-files/add-oidc-provider.yml | 155 ++++++++++++++++++ .../ops-files/add-uaa-client-credentials.yml | 11 ++ .github/ops-files/diego-cell-instances.yml | 4 + .github/ops-files/use-cflinuxfs3.yml | 105 ------------ .github/ops-files/use-latest-capi.yml | 10 ++ .../workflows/tests-integration-reusable.yml | 72 ++------ .github/workflows/tests-integration.yml | 21 --- .../handle_stack_override_test.go | 2 +- api/cloudcontroller/ccv3/buildpack_test.go | 8 +- cf/commands/buildpack/buildpacks_test.go | 8 +- command/v7/app_command_test.go | 2 +- command/v7/label_updater_test.go | 2 +- command/v7/labels_command.go | 2 +- command/v7/labels_command_test.go | 6 +- command/v7/set_label_command.go | 2 +- .../v7/shared/app_summary_displayer_test.go | 4 +- .../v7/shared/manifest_diff_displayer_test.go | 8 +- command/v7/unset_label_command.go | 2 +- ...ush-transforms-manifest-before-applying.md | 2 +- doc/v7-plugin-api-changes.md | 6 +- .../helpers/app_instance_table_test.go | 2 +- integration/helpers/stack.go | 6 +- .../v7/isolated/labels_command_test.go | 24 +-- .../v7/isolated/set_label_command_test.go | 2 +- .../v7/isolated/unset_label_command_test.go | 2 +- util/manifestparser/application_test.go | 4 +- 26 files changed, 241 insertions(+), 231 deletions(-) create mode 100644 .github/ops-files/add-oidc-provider.yml create mode 100644 .github/ops-files/add-uaa-client-credentials.yml create mode 100644 .github/ops-files/diego-cell-instances.yml delete mode 100644 .github/ops-files/use-cflinuxfs3.yml create mode 100644 .github/ops-files/use-latest-capi.yml diff --git a/.github/ops-files/add-oidc-provider.yml b/.github/ops-files/add-oidc-provider.yml new file mode 100644 index 00000000000..2ad7e21a443 --- /dev/null +++ b/.github/ops-files/add-oidc-provider.yml @@ -0,0 +1,155 @@ +--- +- type: replace + path: /instance_groups/name=uaa/jobs/name=uaa/properties/login/oauth?/providers? + value: + cli-oidc-provider: + type: oidc1.0 + discoveryUrl: https://uaa-oidc.service.cf.internal:8443/.well-known/openid-configuration + scopes: + - openid + linkText: My other uaa Oauth Provider + showLinkText: true + addShadowUserOnLogin: true + relyingPartyId: rp_oidc_admin + relyingPartySecret: adminsecret + skipSslValidation: true + storeCustomAttributes: true + passwordGrantEnabled: true + attributeMappings: + given_name: given_name + family_name: family_name + user_name: user_name + +- type: replace + path: /instance_groups/name=uaa:after + value: + name: uaa-oidc + instances: 1 + azs: [z1, z2, z3] + vm_type: default + stemcell: default + persistent_disk: 500 + networks: + - name: default + jobs: + - name: uaa + release: uaa + properties: + encryption: + active_key_label: 'key-1' + encryption_keys: + - label: 'key-1' + passphrase: 'MY-PASSPHRASE' + uaadb: + address: sql-db.service.cf.internal + databases: + - name: uaa_oidc + tag: uaa + db_scheme: mysql + port: 3306 + roles: + - name: uaa-oidc + password: "((uaa_oidc_database_password))" + tag: admin + uaa: + url: https://uaa-oidc.service.cf.internal:8443 + jwt: + policy: + active_key_id: key-1 + keys: + key-1: + signingKey: ((uaa-oidc-key1.private_key)) + sslCertificate: ((uaa-oidc_tls.certificate)) + sslPrivateKey: ((uaa-oidc_tls.private_key)) + ca_certs: + - ((mysql_server_certificate.ca)) + clients: + rp_oidc_admin: + authorized-grant-types: authorization_code,client_credentials,refresh_token,user_token,password,urn:ietf:params:oauth:grant-type:saml2-bearer,implicit + redirect-uri: https://uaa.service.cf.internal:8443/login/callback/cli-oidc-provider + scope: openid,uaa.admin,clients.read,clients.write,clients.secret,scim.read,scim.write,clients.admin,uaa.user,doppler.firehose + authorities: uaa.admin,clients.admin + secret: adminsecret + scim: + user: + override: true + users: + - name: admin-oidc + password: "((uaa_oidc_admin_password))" + groups: + - uaa.admin + login: + protocol: https + saml: + activeKeyId: key1 + keys: + key1: + key: ((saml_oidc-key1.private_key)) + passphrase: '' + certificate: ((saml_oidc-key1.certificate)) + +- type: replace + path: /addons/name=bosh-dns-aliases/jobs/name=bosh-dns-aliases/properties/aliases/- + value: + domain: uaa-oidc.service.cf.internal + targets: + - query: '*' + instance_group: uaa-oidc + deployment: cf + network: default + domain: bosh + +- type: replace + path: /instance_groups/name=database/jobs/name=pxc-mysql/properties/seeded_databases?/- + value: + name: uaa_oidc + username: uaa-oidc + password: "((uaa_oidc_database_password))" + +- type: replace + path: /variables?/- + value: + name: uaa_oidc_admin_password + type: password + +- type: replace + path: /variables?/- + value: + name: uaa_oidc_database_password + type: password + +- type: replace + path: /variables?/- + value: + name: uaa-oidc-key1 + type: rsa + +- type: replace + path: /variables?/- + value: + name: uaa-oidc_ca + type: certificate + options: + is_ca: true + common_name: uaa-oidc + alternative_names: ["*.uaa-oidc.service.cf.internal"] + extended_key_usage: + - server_auth + +- type: replace + path: /variables?/- + value: + name: saml_oidc-key1 + type: certificate + options: + ca: uaa-oidc_ca + common_name: saml_oidc + +- type: replace + path: /variables?/- + value: + name: uaa-oidc_tls + type: certificate + options: + ca: uaa-oidc_ca + common_name: uaa-oidc.service.cf.internal diff --git a/.github/ops-files/add-uaa-client-credentials.yml b/.github/ops-files/add-uaa-client-credentials.yml new file mode 100644 index 00000000000..68a9f060850 --- /dev/null +++ b/.github/ops-files/add-uaa-client-credentials.yml @@ -0,0 +1,11 @@ +--- +- type: replace + path: /instance_groups/name=uaa/jobs/name=uaa/properties/uaa/clients/potato-face? + value: + access-token-validity: 600 + authorized-grant-types: client_credentials + override: true + secret: ((client-secret)) + scope: openid,routing.router_groups.write,scim.read,cloud_controller.admin,uaa.user,routing.router_groups.read,cloud_controller.read,password.write,cloud_controller.write,network.admin,doppler.firehose,scim.write,uaa.admin + authorities: openid,routing.router_groups.write,scim.read,cloud_controller.admin,uaa.user,routing.router_groups.read,cloud_controller.read,password.write,cloud_controller.write,network.admin,doppler.firehose,scim.write,uaa.admin + diff --git a/.github/ops-files/diego-cell-instances.yml b/.github/ops-files/diego-cell-instances.yml new file mode 100644 index 00000000000..87d715d696c --- /dev/null +++ b/.github/ops-files/diego-cell-instances.yml @@ -0,0 +1,4 @@ +--- +- type: replace + path: /instance_groups/name=diego-cell/instances + value: 3 diff --git a/.github/ops-files/use-cflinuxfs3.yml b/.github/ops-files/use-cflinuxfs3.yml deleted file mode 100644 index 5e52e190372..00000000000 --- a/.github/ops-files/use-cflinuxfs3.yml +++ /dev/null @@ -1,105 +0,0 @@ -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/diego/droplet_destinations/cflinuxfs3? - value: /home/vcap -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/diego/lifecycle_bundles/buildpack~1cflinuxfs3? - value: buildpack_app_lifecycle/buildpack_app_lifecycle.tgz -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/stacks/name=cflinuxfs4:before - value: - description: Cloud Foundry Linux-based filesystem (Ubuntu 18.04) - name: cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/0:before - value: - name: staticfile_buildpack - package: staticfile-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/0:after - value: - name: java_buildpack - package: java-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/1:after - value: - name: ruby_buildpack - package: ruby-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/2:after - value: - name: dotnet_core_buildpack - package: dotnet-core-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/3:after - value: - name: nodejs_buildpack - package: nodejs-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/4:after - value: - name: go_buildpack - package: go-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/5:after - value: - name: python_buildpack - package: python-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/6:after - value: - name: php_buildpack - package: php-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/7:after - value: - name: nginx_buildpack - package: nginx-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/8:after - value: - name: r_buildpack - package: r-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=api/jobs/name=cloud_controller_ng/properties/cc/install_buildpacks/9:after - value: - name: binary_buildpack - package: binary-buildpack-cflinuxfs3 -- type: replace - path: /instance_groups/name=cc-worker/jobs/name=cloud_controller_worker/properties/cc/diego/droplet_destinations/cflinuxfs3? - value: /home/vcap -- type: replace - path: /instance_groups/name=cc-worker/jobs/name=cloud_controller_worker/properties/cc/diego/lifecycle_bundles/buildpack~1cflinuxfs3? - value: buildpack_app_lifecycle/buildpack_app_lifecycle.tgz -- type: replace - path: /instance_groups/name=scheduler/jobs/name=cloud_controller_clock/properties/cc/diego/droplet_destinations/cflinuxfs3? - value: /home/vcap -- type: replace - path: /instance_groups/name=scheduler/jobs/name=cloud_controller_clock/properties/cc/diego/lifecycle_bundles/buildpack~1cflinuxfs3? - value: buildpack_app_lifecycle/buildpack_app_lifecycle.tgz -- type: replace - path: /instance_groups/name=scheduler/jobs/name=cc_deployment_updater/properties/cc/diego/droplet_destinations/cflinuxfs3? - value: /home/vcap -- type: replace - path: /instance_groups/name=scheduler/jobs/name=cc_deployment_updater/properties/cc/diego/lifecycle_bundles/buildpack~1cflinuxfs3? - value: buildpack_app_lifecycle/buildpack_app_lifecycle.tgz -- type: replace - path: /instance_groups/name=diego-cell/jobs/name=cflinuxfs3-rootfs-setup? - value: - name: cflinuxfs3-rootfs-setup - properties: - cflinuxfs3-rootfs: - trusted_certs: - - ((diego_instance_identity_ca.ca)) - - ((credhub_tls.ca)) - - ((uaa_ssl.ca)) - release: cflinuxfs3 -- type: replace - path: /instance_groups/name=diego-cell/jobs/name=rep/properties/diego/rep/preloaded_rootfses/0:before - value: cflinuxfs3:/var/vcap/packages/cflinuxfs3/rootfs.tar -- type: replace - path: /releases/name=cflinuxfs4:before - value: - name: cflinuxfs3 - sha1: 5463400cd5490e9d847326668d504a8833cf3e4e - url: https://bosh.io/d/github.com/cloudfoundry/cflinuxfs3-release?v=0.369.0 - version: 0.369.0 diff --git a/.github/ops-files/use-latest-capi.yml b/.github/ops-files/use-latest-capi.yml new file mode 100644 index 00000000000..216b9df70c0 --- /dev/null +++ b/.github/ops-files/use-latest-capi.yml @@ -0,0 +1,10 @@ +--- +- type: replace + path: /releases/name=capi/version + value: latest + +- type: remove + path: /releases/name=capi/url? + +- type: remove + path: /releases/name=capi/sha1? diff --git a/.github/workflows/tests-integration-reusable.yml b/.github/workflows/tests-integration-reusable.yml index 7e469d4b3a2..99fdf33c45f 100644 --- a/.github/workflows/tests-integration-reusable.yml +++ b/.github/workflows/tests-integration-reusable.yml @@ -10,9 +10,6 @@ name: "pvt: run integration tests" on: workflow_call: inputs: - capi-version: - required: true - type: string run-with-client-creds: required: true type: boolean @@ -45,38 +42,16 @@ jobs: with: ref: ${{inputs.gitRef}} - - name: Checkout cli-ci - uses: actions/checkout@v4 - with: - repository: cloudfoundry/cli-ci - path: cli-ci - - name: Checkout cf-acceptance-tests + if: ${{ inputs.name == 'cats' }} uses: actions/checkout@v4 with: repository: cloudfoundry/cf-acceptance-tests ref: release-candidate path: cf-acceptance-tests - - id: read-min-capi - name: Read MIN CAPI - run: | - wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq &&\ - chmod +x /usr/bin/yq - version=$(yq '.capi-version-min' build_data.yml) - echo "version=$version" >> $GITHUB_OUTPUT - - - name: Checkout cf-deployment Min CAPI - if: ${{ inputs.capi-version != 'edge' }} - uses: actions/checkout@v4 - with: - repository: cloudfoundry/cf-deployment - path: cf-deployment - ref: ${{ steps.read-min-capi.outputs.version }} - - name: Checkout cf-deployment uses: actions/checkout@v4 - if: ${{ inputs.capi-version == 'edge' }} with: repository: cloudfoundry/cf-deployment path: cf-deployment @@ -96,7 +71,7 @@ jobs: run: | shepherd login service-account ${account_token} - echo "shepherd create lease --duration 8h --pool ${pool_name} --pool-namespace ${pool_namespace} --namespace tas-devex" + echo "shepherd create lease --duration 8h --pool ${pool_name} --pool-namespace ${pool_namespace} --namespace tas-devex --description 'CLI GHA'" lease_id=$(shepherd create lease --duration 8h --pool ${pool_name} --pool-namespace ${pool_namespace} --namespace tas-devex --json | jq -r .id) # Give sometime for the lease to complete. Shepherd may take upto an 3 hours to create an env # if the pool is empty. @@ -160,9 +135,14 @@ jobs: apt-get install -y build-essential unzip - name: Upload latest CAPI release - if: ${{ inputs.capi-version == 'edge' }} + env: + capi_release_version: ${{ vars.CAPI_RELEASE_VERSION }} run: | - capi_release_version=$(curl -s https://api.github.com/repos/cloudfoundry/capi-release/releases/latest | jq -r .tag_name) + if [ -z "$capi_release_version" ] + then + capi_release_version=$(curl -s https://api.github.com/repos/cloudfoundry/capi-release/releases/latest | jq -r .tag_name) + fi + echo "Latest CAPI release is $capi_release_version" eval "$(bbl print-env --metadata-file metadata.json)" @@ -172,7 +152,6 @@ jobs: bosh upload-release "https://bosh.io/d/github.com/cloudfoundry/capi-release?v=$capi_release_version" - name: Deploy Isolation Segment and OIDC Provider - if: ${{ inputs.capi-version == 'edge' }} run: | env_name=$(jq -r .name metadata.json) jq -r .bosh.jumpbox_private_key metadata.json > /tmp/${env_name}.priv @@ -181,36 +160,13 @@ jobs: # deploy bosh -d cf manifest > /tmp/manifest.yml bosh interpolate /tmp/manifest.yml \ - -o .github/ops-files/use-cflinuxfs3.yml \ - -o .github/ops-files/replace-redis.yml \ -o cf-deployment/operations/use-internal-lookup-for-route-services.yml \ -o cf-deployment/operations/add-persistent-isolation-segment-diego-cell.yml \ - -o cli-ci/ci/infrastructure/operations/use-latest-capi.yml \ - -o cli-ci/ci/infrastructure/operations/add-oidc-provider.yml \ - -o cli-ci/ci/infrastructure/operations/add-uaa-client-credentials.yml \ - -o cli-ci/ci/infrastructure/operations/diego-cell-instances.yml \ - -v client-secret="${{ secrets.CLIENT_SECRET }}" \ - > ./director.yml - - bosh -d cf deploy director.yml -n - echo "Deployed CAPI version:" - bosh -d cf releases | grep capi - - - name: Deploy MIN CAPI with Isolation Segment and OIDC Provider - if: ${{ inputs.capi-version != 'edge' }} - run: | - env_name=$(jq -r .name metadata.json) - jq -r .bosh.jumpbox_private_key metadata.json > /tmp/${env_name}.priv - eval "$(bbl print-env --metadata-file metadata.json)" - - # deploy - bosh -d cf manifest > /tmp/manifest.yml - bosh interpolate /tmp/manifest.yml \ - -o cf-deployment/operations/test/add-persistent-isolation-segment-diego-cell.yml \ - -o cli-ci/ci/infrastructure/operations/add-oidc-provider.yml \ - -o cli-ci/ci/infrastructure/operations/add-uaa-client-credentials.yml \ - -o cli-ci/ci/infrastructure/operations/diego-cell-instances.yml \ - -o cli-ci/ci/infrastructure/operations/use-latest-ruby-buildpack.yml \ + -o .github/ops-files/replace-redis.yml \ + -o .github/ops-files/use-latest-capi.yml \ + -o .github/ops-files/add-oidc-provider.yml \ + -o .github/ops-files/add-uaa-client-credentials.yml \ + -o .github/ops-files/diego-cell-instances.yml \ -v client-secret="${{ secrets.CLIENT_SECRET }}" \ > ./director.yml diff --git a/.github/workflows/tests-integration.yml b/.github/workflows/tests-integration.yml index 0e6eb294da5..4da7454fc4e 100644 --- a/.github/workflows/tests-integration.yml +++ b/.github/workflows/tests-integration.yml @@ -13,7 +13,6 @@ on: - all - run-integration-tests-cf-env - run-integration-tests-cf-env-with-client-creds - # - run-integration-tests-cf-env-with-min-capi - run-cats-cf-env push: tags: @@ -73,7 +72,6 @@ jobs: if: ${{ github.event_name != 'workflow_dispatch' || inputs.workflow == 'all' || inputs.workflow == 'run-integration-tests-cf-env' }} uses: ./.github/workflows/tests-integration-reusable.yml with: - capi-version: edge run-with-client-creds: false os: ubuntu-latest name: Integration @@ -88,30 +86,12 @@ jobs: if: ${{ github.event_name != 'workflow_dispatch' || inputs.workflow == 'all' || inputs.workflow == 'run-integration-tests-cf-env-with-client-creds' }} uses: ./.github/workflows/tests-integration-reusable.yml with: - capi-version: edge run-with-client-creds: true os: ubuntu-latest name: Integration client creds gitRef: ${{needs.get-sha.outputs.gitRef}} secrets: inherit - # run-integration-tests-cf-env-with-min-capi: - # name: MIN CAPI - # needs: - # - get-sha - # - units - # if: ${{ github.event_name != 'workflow_dispatch' || inputs.workflow == 'all' || inputs.workflow == 'run-integration-tests-cf-env-with-min-capi' }} - # uses: ./.github/workflows/tests-integration-reusable.yml - # with: - # capi-version: min - # run-with-client-creds: false - # os: ubuntu-latest - # name: Integration MIN CAPI - # pool-name: cfd_16_11_0 - # pool-namespace: tas-devex - # is-pr: ${{ github.event_name != 'workflow_dispatch' }} - # secrets: inherit - run-cats-cf-env: name: CATS needs: @@ -121,7 +101,6 @@ jobs: if: ${{ github.event_name != 'workflow_dispatch' || inputs.workflow == 'all' || inputs.workflow == 'run-cats-cf-env' }} uses: ./.github/workflows/tests-integration-reusable.yml with: - capi-version: edge run-with-client-creds: false os: ubuntu-latest name: cats diff --git a/actor/v7pushaction/handle_stack_override_test.go b/actor/v7pushaction/handle_stack_override_test.go index 8d7ebb32f93..a7dd434f7be 100644 --- a/actor/v7pushaction/handle_stack_override_test.go +++ b/actor/v7pushaction/handle_stack_override_test.go @@ -51,7 +51,7 @@ var _ = Describe("HandleStackOverride", func() { originalManifest.Applications = []manifestparser.Application{ { - Stack: "cflinuxfs3", + Stack: "cflinuxfs4", }, } }) diff --git a/api/cloudcontroller/ccv3/buildpack_test.go b/api/cloudcontroller/ccv3/buildpack_test.go index 735a99fb0f3..9ef09c56dc9 100644 --- a/api/cloudcontroller/ccv3/buildpack_test.go +++ b/api/cloudcontroller/ccv3/buildpack_test.go @@ -68,7 +68,7 @@ var _ = Describe("Buildpacks", func() { "guid": "guid2", "name": "staticfile_buildpack", "state": "AWAITING_UPLOAD", - "stack": "cflinuxfs3", + "stack": "cflinuxfs4", "position": 2, "enabled": false, "locked": true, @@ -87,7 +87,7 @@ var _ = Describe("Buildpacks", func() { "guid": "guid3", "name": "go_buildpack", "state": "AWAITING_UPLOAD", - "stack": "cflinuxfs2", + "stack": "cflinuxfs4", "position": 3, "enabled": true, "locked": false, @@ -137,7 +137,7 @@ var _ = Describe("Buildpacks", func() { Position: types.NullInt{Value: 2, IsSet: true}, Enabled: types.NullBool{Value: false, IsSet: true}, Locked: types.NullBool{Value: true, IsSet: true}, - Stack: "cflinuxfs3", + Stack: "cflinuxfs4", State: "AWAITING_UPLOAD", Metadata: &Metadata{Labels: map[string]types.NullString{}}, }, @@ -147,7 +147,7 @@ var _ = Describe("Buildpacks", func() { Position: types.NullInt{Value: 3, IsSet: true}, Enabled: types.NullBool{Value: true, IsSet: true}, Locked: types.NullBool{Value: false, IsSet: true}, - Stack: "cflinuxfs2", + Stack: "cflinuxfs4", State: "AWAITING_UPLOAD", Metadata: &Metadata{Labels: map[string]types.NullString{}}, }, diff --git a/cf/commands/buildpack/buildpacks_test.go b/cf/commands/buildpack/buildpacks_test.go index d50f0314699..2b9c00fc954 100644 --- a/cf/commands/buildpack/buildpacks_test.go +++ b/cf/commands/buildpack/buildpacks_test.go @@ -79,7 +79,7 @@ var _ = Describe("ListBuildpacks", func() { p3 := 15 t := true f := false - linux := "cflinuxfs2" + linux := "cflinuxfs4" buildpackRepo.Buildpacks = []models.Buildpack{ {Name: "Buildpack-1", Stack: linux, Position: &p1, Enabled: &t, Locked: &f}, @@ -92,9 +92,9 @@ var _ = Describe("ListBuildpacks", func() { Expect(ui.Outputs()).To(ContainSubstrings( []string{"Getting buildpacks"}, []string{"buildpack", "stack", "position", "enabled"}, - []string{"Buildpack-1", "cflinuxfs2", "5", "true", "false"}, - []string{"Buildpack-2", "cflinuxfs2", "10", "false", "true"}, - []string{"Buildpack-3", "cflinuxfs2", "15", "true", "false"}, + []string{"Buildpack-1", "cflinuxfs4", "5", "true", "false"}, + []string{"Buildpack-2", "cflinuxfs4", "10", "false", "true"}, + []string{"Buildpack-3", "cflinuxfs4", "15", "true", "false"}, )) }) diff --git a/command/v7/app_command_test.go b/command/v7/app_command_test.go index 0bdd6544a2c..c64703644a7 100644 --- a/command/v7/app_command_test.go +++ b/command/v7/app_command_test.go @@ -203,7 +203,7 @@ var _ = Describe("app Command", func() { }, }, CurrentDroplet: resources.Droplet{ - Stack: "cflinuxfs2", + Stack: "cflinuxfs4", Buildpacks: []resources.DropletBuildpack{ { Name: "ruby_buildpack", diff --git a/command/v7/label_updater_test.go b/command/v7/label_updater_test.go index 8c07196e533..94843b12d5a 100644 --- a/command/v7/label_updater_test.go +++ b/command/v7/label_updater_test.go @@ -131,7 +131,7 @@ var _ = Describe("LabelUpdater", func() { func(resourceType string) { targetResource = TargetResource{ ResourceType: resourceType, - BuildpackStack: "cflinuxfs3", + BuildpackStack: "cflinuxfs4", } err := cmd.Execute(targetResource, nil) diff --git a/command/v7/labels_command.go b/command/v7/labels_command.go index 4b371508558..1899b43f83c 100644 --- a/command/v7/labels_command.go +++ b/command/v7/labels_command.go @@ -116,7 +116,7 @@ func (cmd LabelsCommand) Examples() string { return ` cf labels app dora cf labels org business -cf labels buildpack go_buildpack --stack cflinuxfs3` +cf labels buildpack go_buildpack --stack cflinuxfs4` } func (cmd LabelsCommand) Resources() string { diff --git a/command/v7/labels_command_test.go b/command/v7/labels_command_test.go index 09dba552751..e854d678704 100644 --- a/command/v7/labels_command_test.go +++ b/command/v7/labels_command_test.go @@ -73,7 +73,7 @@ var _ = Describe("labels command", func() { "Failure when --stack is combined with anything other than 'buildpack'", func(resourceType string) { cmd.RequiredArgs.ResourceType = resourceType - cmd.BuildpackStack = "cflinuxfs3" + cmd.BuildpackStack = "cflinuxfs4" executeErr = cmd.Execute(nil) @@ -751,14 +751,14 @@ var _ = Describe("labels command", func() { ResourceType: "buildpack", ResourceName: "oshkosh", } - cmd.BuildpackStack = "cflinuxfs3" + cmd.BuildpackStack = "cflinuxfs4" }) It("retrieves the labels when resource type is buildpack", func() { Expect(executeErr).ToNot(HaveOccurred()) Expect(fakeLabelsActor.GetBuildpackLabelsCallCount()).To(Equal(1)) buildpackName, stackName := fakeLabelsActor.GetBuildpackLabelsArgsForCall(0) Expect(buildpackName).To(Equal("oshkosh")) - Expect(stackName).To(Equal("cflinuxfs3")) + Expect(stackName).To(Equal("cflinuxfs4")) }) }) }) diff --git a/command/v7/set_label_command.go b/command/v7/set_label_command.go index 05f833e058d..06522547b4f 100644 --- a/command/v7/set_label_command.go +++ b/command/v7/set_label_command.go @@ -72,7 +72,7 @@ func (cmd SetLabelCommand) Examples() string { return ` cf set-label app dora env=production cf set-label org business pci=true public-facing=false -cf set-label buildpack go_buildpack go=1.12 -s cflinuxfs3` +cf set-label buildpack go_buildpack go=1.12 -s cflinuxfs4` } func (cmd SetLabelCommand) Resources() string { diff --git a/command/v7/shared/app_summary_displayer_test.go b/command/v7/shared/app_summary_displayer_test.go index 5fe07877248..833dc595cd3 100644 --- a/command/v7/shared/app_summary_displayer_test.go +++ b/command/v7/shared/app_summary_displayer_test.go @@ -654,7 +654,7 @@ var _ = Describe("app summary displayer", func() { }, }, CurrentDroplet: resources.Droplet{ - Stack: "cflinuxfs2", + Stack: "cflinuxfs4", Buildpacks: []resources.DropletBuildpack{ { Name: "ruby_buildpack", @@ -684,7 +684,7 @@ var _ = Describe("app summary displayer", func() { }) It("displays stack and buildpacks", func() { - Expect(testUI.Out).To(Say(`stack:\s+cflinuxfs2\n`)) + Expect(testUI.Out).To(Say(`stack:\s+cflinuxfs4\n`)) Expect(testUI.Out).To(Say(`buildpacks:\s+\n`)) Expect(testUI.Out).To(Say(`name\s+version\s+detect output\s+buildpack name\n`)) Expect(testUI.Out).To(Say(`ruby_buildpack\s+0.0.1\s+some-detect-output\s+ruby_buildpack_name\n`)) diff --git a/command/v7/shared/manifest_diff_displayer_test.go b/command/v7/shared/manifest_diff_displayer_test.go index 968014b3210..e40dfa2fb4e 100644 --- a/command/v7/shared/manifest_diff_displayer_test.go +++ b/command/v7/shared/manifest_diff_displayer_test.go @@ -66,7 +66,7 @@ applications: parameters: key1: value1 key2: value2 - stack: cflinuxfs3 + stack: cflinuxfs4 metadata: annotations: contact: "bob@example.com jane@example.com" @@ -112,7 +112,7 @@ applications: parameters: key1: value1 key2: value2 - stack: cflinuxfs3 + stack: cflinuxfs4 metadata: annotations: contact: "bob@example.com jane@example.com" @@ -379,7 +379,7 @@ applications: parameters: key1: value1 key2: value2 - stack: cflinuxfs3 + stack: cflinuxfs4 metadata: annotations: contact: "bob@example.com jane@example.com" @@ -426,7 +426,7 @@ applications: parameters: key1: value1 key2: value2 - stack: cflinuxfs3 + stack: cflinuxfs4 metadata: annotations: contact: bob@example.com jane@example.com diff --git a/command/v7/unset_label_command.go b/command/v7/unset_label_command.go index 2fa752cf396..0636f7d0097 100644 --- a/command/v7/unset_label_command.go +++ b/command/v7/unset_label_command.go @@ -64,7 +64,7 @@ func (cmd UnsetLabelCommand) Examples() string { return ` cf unset-label app dora ci_signature_sha2 cf unset-label org business pci public-facing -cf unset-label buildpack go_buildpack go -s cflinuxfs3` +cf unset-label buildpack go_buildpack go -s cflinuxfs4` } func (cmd UnsetLabelCommand) Resources() string { diff --git a/doc/adr/0005-v7-push-transforms-manifest-before-applying.md b/doc/adr/0005-v7-push-transforms-manifest-before-applying.md index da5b0728659..35bd334fbb1 100644 --- a/doc/adr/0005-v7-push-transforms-manifest-before-applying.md +++ b/doc/adr/0005-v7-push-transforms-manifest-before-applying.md @@ -49,7 +49,7 @@ Updating app with these attributes... + instances: 3 memory: - stack: cflinuxfs3 + stack: cflinuxfs4 routes: dora.sheer-shark.lite.cli.fun ``` diff --git a/doc/v7-plugin-api-changes.md b/doc/v7-plugin-api-changes.md index aa3691de7a1..60a673ee9be 100644 --- a/doc/v7-plugin-api-changes.md +++ b/doc/v7-plugin-api-changes.md @@ -53,7 +53,7 @@ V6 "StagingFailedReason": "", "Stack": { "Guid": "881b268c-d234-4c08-b5c5-50099ccb02bc", - "Name": "cflinuxfs3", + "Name": "cflinuxfs4", "Description": "" }, "Instances": [ @@ -180,7 +180,7 @@ V7 "GUID": "0110f8db-f426-4aad-87d1-4106050cd129", "State": "STAGED", "CreatedAt": "2020-01-14T22:51:13Z", - "Stack": "cflinuxfs3", + "Stack": "cflinuxfs4", "Image": "", "Buildpacks": [ { @@ -439,7 +439,7 @@ V7 { "Name": "some-app", "GUID": "defbb5bb-f010-4e4c-9841-60f641dd5bd4", - "StackName": "cflinuxfs3", + "StackName": "cf4", "State": "STARTED", "LifecycleType": "buildpack", "LifecycleBuildpacks": null, diff --git a/integration/helpers/app_instance_table_test.go b/integration/helpers/app_instance_table_test.go index f2ef1e62b21..ea3f75a2665 100644 --- a/integration/helpers/app_instance_table_test.go +++ b/integration/helpers/app_instance_table_test.go @@ -15,7 +15,7 @@ Showing health and status for app dora in org wut / space wut as admin... name: dora requested state: started routes: dora.bosh-lite.com -stack: cflinuxfs2 +stack: cflinuxfs4 buildpacks: ruby 1.6.44 type: web diff --git a/integration/helpers/stack.go b/integration/helpers/stack.go index 34fa24439bc..4a182700f08 100644 --- a/integration/helpers/stack.go +++ b/integration/helpers/stack.go @@ -36,17 +36,17 @@ func FetchStacks() []string { return stacks } -// PreferredStack returns the cflinuxfs3 stack name if it present, otherwise cflinuxfs2 is returned. +// PreferredStack returns the cflinuxfs4 stack name if it present, otherwise cflinuxfs3 is returned. func PreferredStack() string { stacks := FetchStacks() for _, name := range stacks { - if name == "cflinuxfs3" { + if name == "cflinuxfs4" { return name } } - return "cflinuxfs2" + return "cflinuxfs3" } // CreateStack creates a new stack with the user provided name. If a name is not provided, a random name is used diff --git a/integration/v7/isolated/labels_command_test.go b/integration/v7/isolated/labels_command_test.go index a5400152a15..c8182e00285 100644 --- a/integration/v7/isolated/labels_command_test.go +++ b/integration/v7/isolated/labels_command_test.go @@ -32,7 +32,7 @@ var _ = Describe("labels command", func() { Eventually(session).Should(Say("EXAMPLES:")) Eventually(session).Should(Say(`\s+cf labels app dora`)) Eventually(session).Should(Say(`\s+cf labels org business`)) - Eventually(session).Should(Say(`\s+cf labels buildpack go_buildpack --stack cflinuxfs3`)) + Eventually(session).Should(Say(`\s+cf labels buildpack go_buildpack --stack cflinuxfs4`)) Eventually(session).Should(Say("RESOURCES:")) Eventually(session).Should(Say(`\s+app`)) Eventually(session).Should(Say(`\s+buildpack`)) @@ -184,12 +184,12 @@ var _ = Describe("labels command", func() { When("the buildpack is bound to a stack", func() { BeforeEach(func() { - helpers.SetupBuildpackWithStack(buildpackName, "cflinuxfs3") - session := helpers.CF("set-label", "buildpack", buildpackName, "-s", "cflinuxfs3", "some-other-key=some-other-value", "some-key=some-value") + helpers.SetupBuildpackWithStack(buildpackName, "cflinuxfs4") + session := helpers.CF("set-label", "buildpack", buildpackName, "-s", "cflinuxfs4", "some-other-key=some-other-value", "some-key=some-value") Eventually(session).Should(Exit(0)) }) AfterEach(func() { - session := helpers.CF("delete-buildpack", buildpackName, "-f", "-s", "cflinuxfs3") + session := helpers.CF("delete-buildpack", buildpackName, "-f", "-s", "cflinuxfs4") Eventually(session).Should(Exit(0)) }) @@ -203,8 +203,8 @@ var _ = Describe("labels command", func() { }) It("lists the labels when the stack is specified", func() { - session := helpers.CF("labels", "buildpack", buildpackName, "-s", "cflinuxfs3") - Eventually(session).Should(Say(regexp.QuoteMeta("Getting labels for buildpack %s with stack %s as %s...\n\n"), buildpackName, "cflinuxfs3", username)) + session := helpers.CF("labels", "buildpack", buildpackName, "-s", "cflinuxfs4") + Eventually(session).Should(Say(regexp.QuoteMeta("Getting labels for buildpack %s with stack %s as %s...\n\n"), buildpackName, "cflinuxfs4", username)) Eventually(session).Should(Say(`key\s+value`)) Eventually(session).Should(Say(`some-key\s+some-value`)) Eventually(session).Should(Say(`some-other-key\s+some-other-value`)) @@ -229,16 +229,16 @@ var _ = Describe("labels command", func() { newStackName = helpers.NewStackName() helpers.CreateStack(newStackName) helpers.SetupBuildpackWithStack(buildpackName, newStackName) - helpers.SetupBuildpackWithStack(buildpackName, "cflinuxfs3") + helpers.SetupBuildpackWithStack(buildpackName, "cflinuxfs4") session := helpers.CF("set-label", "buildpack", buildpackName, "-s", newStackName, "my-stack-some-other-key=some-other-value", "some-key=some-value") Eventually(session).Should(Exit(0)) - session = helpers.CF("set-label", "buildpack", buildpackName, "--stack", "cflinuxfs3", + session = helpers.CF("set-label", "buildpack", buildpackName, "--stack", "cflinuxfs4", "cfl2=var2", "cfl1=var1") Eventually(session).Should(Exit(0)) }) AfterEach(func() { - session := helpers.CF("delete-buildpack", buildpackName, "-f", "-s", "cflinuxfs3") + session := helpers.CF("delete-buildpack", buildpackName, "-f", "-s", "cflinuxfs4") Eventually(session).Should(Exit(0)) session = helpers.CF("delete-buildpack", buildpackName, "-f", "-s", newStackName) Eventually(session).Should(Exit(0)) @@ -275,9 +275,9 @@ var _ = Describe("labels command", func() { Eventually(session).Should(Exit(0)) }) - It("lists the labels for buildpackName/cflinuxfs3", func() { - session := helpers.CF("labels", "buildpack", buildpackName, "--stack", "cflinuxfs3") - Eventually(session).Should(Say(regexp.QuoteMeta("Getting labels for buildpack %s with stack cflinuxfs3 as %s...\n\n"), buildpackName, username)) + It("lists the labels for buildpackName/cflinuxfs4", func() { + session := helpers.CF("labels", "buildpack", buildpackName, "--stack", "cflinuxfs4") + Eventually(session).Should(Say(regexp.QuoteMeta("Getting labels for buildpack %s with stack cflinuxfs4 as %s...\n\n"), buildpackName, username)) Eventually(session).Should(Say(`key\s+value`)) Eventually(session).Should(Say(`cfl1\s+var1`)) Eventually(session).Should(Say(`cfl2\s+var2`)) diff --git a/integration/v7/isolated/set_label_command_test.go b/integration/v7/isolated/set_label_command_test.go index 3b7cc72ed21..fac616d7a22 100644 --- a/integration/v7/isolated/set_label_command_test.go +++ b/integration/v7/isolated/set_label_command_test.go @@ -33,7 +33,7 @@ var _ = Describe("set-label command", func() { Eventually(session).Should(Say("EXAMPLES:")) Eventually(session).Should(Say(`\s+cf set-label app dora env=production`)) Eventually(session).Should(Say(`\s+cf set-label org business pci=true public-facing=false`)) - Eventually(session).Should(Say(`\s+cf set-label buildpack go_buildpack go=1.12 -s cflinuxfs3`)) + Eventually(session).Should(Say(`\s+cf set-label buildpack go_buildpack go=1.12 -s cflinuxfs4`)) Eventually(session).Should(Say("RESOURCES:")) Eventually(session).Should(Say(`\s+app`)) Eventually(session).Should(Say(`\s+buildpack`)) diff --git a/integration/v7/isolated/unset_label_command_test.go b/integration/v7/isolated/unset_label_command_test.go index 46434a3da7f..114e40e60ca 100644 --- a/integration/v7/isolated/unset_label_command_test.go +++ b/integration/v7/isolated/unset_label_command_test.go @@ -31,7 +31,7 @@ var _ = Describe("unset-label command", func() { Eventually(session).Should(Say("EXAMPLES:")) Eventually(session).Should(Say(`\s+cf unset-label app dora ci_signature_sha2`)) Eventually(session).Should(Say(`\s+cf unset-label org business pci public-facing`)) - Eventually(session).Should(Say(`\s+cf unset-label buildpack go_buildpack go -s cflinuxfs3`)) + Eventually(session).Should(Say(`\s+cf unset-label buildpack go_buildpack go -s cflinuxfs4`)) Eventually(session).Should(Say("RESOURCES:")) Eventually(session).Should(Say(`\s+app`)) Eventually(session).Should(Say(`\s+buildpack`)) diff --git a/util/manifestparser/application_test.go b/util/manifestparser/application_test.go index eb0474b58bf..3376f264db7 100644 --- a/util/manifestparser/application_test.go +++ b/util/manifestparser/application_test.go @@ -178,13 +178,13 @@ buildpacks: Context("when stack is provided", func() { BeforeEach(func() { rawYAML = []byte(`--- -stack: cflinuxfs3 +stack: cflinuxfs4 `) }) It("unmarshals the stack property", func() { Expect(executeErr).ToNot(HaveOccurred()) - Expect(application.Stack).To(Equal("cflinuxfs3")) + Expect(application.Stack).To(Equal("cflinuxfs4")) }) }) From 7eff23aa4640fd19e46e734651bc73a0d5cfe7a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Sep 2024 09:41:58 -0700 Subject: [PATCH 30/33] Bump code.cloudfoundry.org/clock from 1.7.0 to 1.8.0 (#3162) Bumps [code.cloudfoundry.org/clock](https://github.com/cloudfoundry/clock) from 1.7.0 to 1.8.0. - [Release notes](https://github.com/cloudfoundry/clock/releases) - [Commits](https://github.com/cloudfoundry/clock/compare/v1.7.0...v1.8.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/clock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 4796fddbddd..c0e297fd3f7 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 - code.cloudfoundry.org/clock v1.7.0 + code.cloudfoundry.org/clock v1.8.0 code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 code.cloudfoundry.org/go-log-cache/v2 v2.0.7 code.cloudfoundry.org/go-loggregator/v9 v9.2.1 @@ -65,7 +65,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 // indirect + github.com/google/pprof v0.0.0-20240829160300-da1f7e9f2b25 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/imdario/mergo v0.3.6 // indirect github.com/json-iterator/go v1.1.12 // indirect diff --git a/go.sum b/go.sum index 5e34f1d05d9..b38bce9fb99 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 h1:jaHW code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85/go.mod h1:R1EiyOAr7lW0l/YkZNqItUNZ01Q/dYUfbTn4X4Z+82M= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 h1:O+j8afQWaDuxzKGcculsjgHGK+biBTn6iMjgFpBf54c= code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4/go.mod h1:dVTgo9kQbYns/QM4A1C2GtxqUnFSvJTk2Qhw+M0/uzk= -code.cloudfoundry.org/clock v1.7.0 h1:A2owBjfo13HeyhVpLQMmU8C7u4iAMa4c5UFdB07kp40= -code.cloudfoundry.org/clock v1.7.0/go.mod h1:yMFU8B9HnZCRlTpVUxpf83iwXEisrXbYnRKZxR08r6I= +code.cloudfoundry.org/clock v1.8.0 h1:ZwMn0gnHW3SkYwkSnRyJGthtVQaByupg94MxZrK7NMg= +code.cloudfoundry.org/clock v1.8.0/go.mod h1:fYHefCehCof0TsgRTh7c8Zzwk87+63x3A3YVQasuFYE= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82 h1:Bns1y0jSlcvfP0u8ael+TUlnyNHsNX808zuo58bf5so= code.cloudfoundry.org/diego-ssh v0.0.0-20230810200140-af9d79fe9c82/go.mod h1:L2/glHnSK+wKnsG8oZZqdV2sgYY9NDo/I1aDJGhcWaM= code.cloudfoundry.org/go-log-cache/v2 v2.0.7 h1:yR/JjQ/RscO1n4xVAT9HDYcpx5ET/3Cq2/RhpJml6ZU= @@ -124,8 +124,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA= -github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20240829160300-da1f7e9f2b25 h1:sEDPKUw6iPjczdu33njxFjO6tYa9bfc0z/QyB/zSsBw= +github.com/google/pprof v0.0.0-20240829160300-da1f7e9f2b25/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= From 95dddb530942fb47876b67160156d27c3d6f4bbd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Sep 2024 09:42:43 -0700 Subject: [PATCH 31/33] Bump code.cloudfoundry.org/bytefmt from 0.1.0 to 0.5.0 (#3163) Bumps [code.cloudfoundry.org/bytefmt](https://github.com/cloudfoundry/bytefmt) from 0.1.0 to 0.5.0. - [Release notes](https://github.com/cloudfoundry/bytefmt/releases) - [Commits](https://github.com/cloudfoundry/bytefmt/compare/v0.1.0...v0.5.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/bytefmt dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c0e297fd3f7..0bad072613d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module code.cloudfoundry.org/cli go 1.22.5 require ( - code.cloudfoundry.org/bytefmt v0.1.0 + code.cloudfoundry.org/bytefmt v0.5.0 code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 diff --git a/go.sum b/go.sum index b38bce9fb99..ccc256cb70e 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -code.cloudfoundry.org/bytefmt v0.1.0 h1:NmVhaUPBO59QQpt5vwYW8crDUksCnvTCQi+Q6uOeLwM= -code.cloudfoundry.org/bytefmt v0.1.0/go.mod h1:eF2ZbltNI7Pv+8Cuyeksu9up5FN5konuH0trDJBuscw= +code.cloudfoundry.org/bytefmt v0.5.0 h1:W7PBnnnEaCB1slY8Ax86V68JUF/ZkaWoliraXEPQkIY= +code.cloudfoundry.org/bytefmt v0.5.0/go.mod h1:bKm8GdmgAatc/ifX2VQ0G+BquevgZW/0NeUl5Ic2sU4= code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 h1:Yc9r1p21kEpni9WlG4mwOZw87TB2QlyS9sAEebZ3+ak= code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6/go.mod h1:u5FovqC5GGAEbFPz+IdjycDA+gIjhUwqxnu0vbHwVeM= code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 h1:jaHWw9opYjKPrDT19uydBBWSxl+g5F4Hv030fqMsalo= From 4616970b85e0819cb66e00ee1ac0a2c5207a6058 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:12:52 -0700 Subject: [PATCH 32/33] Bump code.cloudfoundry.org/tlsconfig from 0.1.0 to 0.2.0 (#3165) Bumps [code.cloudfoundry.org/tlsconfig](https://github.com/cloudfoundry/tlsconfig) from 0.1.0 to 0.2.0. - [Release notes](https://github.com/cloudfoundry/tlsconfig/releases) - [Commits](https://github.com/cloudfoundry/tlsconfig/compare/v0.1.0...v0.2.0) --- updated-dependencies: - dependency-name: code.cloudfoundry.org/tlsconfig dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 0bad072613d..65a5748f0f3 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f code.cloudfoundry.org/jsonry v1.1.4 code.cloudfoundry.org/lager/v3 v3.3.0 - code.cloudfoundry.org/tlsconfig v0.1.0 + code.cloudfoundry.org/tlsconfig v0.2.0 code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 github.com/blang/semver/v4 v4.0.0 diff --git a/go.sum b/go.sum index ccc256cb70e..caa4ecf8c69 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ code.cloudfoundry.org/jsonry v1.1.4/go.mod h1:6aKilShQP7w/Ez76h1El2/n9y2OkHuU56n code.cloudfoundry.org/lager v1.1.1-0.20191008172124-a9afc05ee5be/go.mod h1:O2sS7gKP3HM2iemG+EnwvyNQK7pTSC6Foi4QiMp9sSk= code.cloudfoundry.org/lager/v3 v3.3.0 h1:adWGo2aBLpHVfUG+3D2FQ4B6Mf2Bcz47KITbn8V4b0k= code.cloudfoundry.org/lager/v3 v3.3.0/go.mod h1:k/AYgZTVrwQaneNfQ2EwnZxUb9iUFE7i6AJ3KVOtAdE= -code.cloudfoundry.org/tlsconfig v0.1.0 h1:/SGZk3K7t79cuhSVs/qZXayEnLV1kodmvU3EBcc4E4w= -code.cloudfoundry.org/tlsconfig v0.1.0/go.mod h1:6ymG8DjGLta+bnqdpUmdv88Ikje2VvOTq+8drVe4pUU= +code.cloudfoundry.org/tlsconfig v0.2.0 h1:OPmMIduZVg1AE6m7V+CrULybZMeEWLPXxkKAc0RYLlU= +code.cloudfoundry.org/tlsconfig v0.2.0/go.mod h1:7soG27nMBzgrlYo6FuVCVxCjdMmVUBgdKLmtjrMFBrg= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d h1:M+zXqtXJqcsmpL76aU0tdl1ho23eYa4axYoM4gD62UA= code.cloudfoundry.org/ykk v0.0.0-20170424192843-e4df4ce2fd4d/go.mod h1:YUJiVOr5xl0N/RjMxM1tHmgSpBbi5UM+KoVR5AoejO0= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= @@ -257,8 +257,8 @@ github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcY github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.step.sm/crypto v0.51.1 h1:ktUg/2hetEMiBAqgz502ktZDGoDoGrcHFg3XpkmkvvA= -go.step.sm/crypto v0.51.1/go.mod h1:PdrhttNU/tG9/YsVd4fdlysBN+UV503p0o2irFZQlAw= +go.step.sm/crypto v0.51.2 h1:5EiCGIMg7IvQTGmJrwRosbXeprtT80OhoS/PJarg60o= +go.step.sm/crypto v0.51.2/go.mod h1:QK7czLjN2k+uqVp5CHXxJbhc70kVRSP+0CQF3zsR5M0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= From 854ced23cfa5259a4809c46b8d182ceb2d7a44e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:08:25 -0700 Subject: [PATCH 33/33] Bump code.cloudfoundry.org/bytefmt from 0.5.0 to 0.6.0 (#3172) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 65a5748f0f3..03815852fc2 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module code.cloudfoundry.org/cli go 1.22.5 require ( - code.cloudfoundry.org/bytefmt v0.5.0 + code.cloudfoundry.org/bytefmt v0.6.0 code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 code.cloudfoundry.org/cli/integration/assets/hydrabroker v0.0.0-20201002233634-81722a1144e4 @@ -65,7 +65,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20240829160300-da1f7e9f2b25 // indirect + github.com/google/pprof v0.0.0-20240903155634-a8630aee4ab9 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/imdario/mergo v0.3.6 // indirect github.com/json-iterator/go v1.1.12 // indirect diff --git a/go.sum b/go.sum index caa4ecf8c69..64e75871a38 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -code.cloudfoundry.org/bytefmt v0.5.0 h1:W7PBnnnEaCB1slY8Ax86V68JUF/ZkaWoliraXEPQkIY= -code.cloudfoundry.org/bytefmt v0.5.0/go.mod h1:bKm8GdmgAatc/ifX2VQ0G+BquevgZW/0NeUl5Ic2sU4= +code.cloudfoundry.org/bytefmt v0.6.0 h1:R8momoB6yecXFw3OPQvtSG+imXqzisp5lQyT2dKwsjo= +code.cloudfoundry.org/bytefmt v0.6.0/go.mod h1:lo7u8g+4pNIGuIdo2mew7IGs8162hi2lR8ID8+5W+RA= code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6 h1:Yc9r1p21kEpni9WlG4mwOZw87TB2QlyS9sAEebZ3+ak= code.cloudfoundry.org/cfnetworking-cli-api v0.0.0-20190103195135-4b04f26287a6/go.mod h1:u5FovqC5GGAEbFPz+IdjycDA+gIjhUwqxnu0vbHwVeM= code.cloudfoundry.org/cli-plugin-repo v0.0.0-20200304195157-af98c4be9b85 h1:jaHWw9opYjKPrDT19uydBBWSxl+g5F4Hv030fqMsalo= @@ -124,8 +124,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240829160300-da1f7e9f2b25 h1:sEDPKUw6iPjczdu33njxFjO6tYa9bfc0z/QyB/zSsBw= -github.com/google/pprof v0.0.0-20240829160300-da1f7e9f2b25/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20240903155634-a8630aee4ab9 h1:q5g0N9eal4bmJwXHC5z0QCKs8qhS35hFfq0BAYsIwZI= +github.com/google/pprof v0.0.0-20240903155634-a8630aee4ab9/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=