github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/actor/v7action/task_test.go (about)

     1  package v7action_test
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/resources"
     5  	"errors"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	. "code.cloudfoundry.org/cli/actor/v7action"
     9  	"code.cloudfoundry.org/cli/actor/v7action/v7actionfakes"
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
    12  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("Task Actions", func() {
    18  	var (
    19  		actor                     *Actor
    20  		fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient)
    25  		actor = NewActor(fakeCloudControllerClient, nil, nil, nil)
    26  	})
    27  
    28  	Describe("RunTask", func() {
    29  		When("the application exists", func() {
    30  			BeforeEach(func() {
    31  				fakeCloudControllerClient.CreateApplicationTaskReturns(
    32  					resources.Task{
    33  						SequenceID: 3,
    34  					},
    35  					ccv3.Warnings{
    36  						"warning-1",
    37  						"warning-2",
    38  					},
    39  					nil,
    40  				)
    41  			})
    42  
    43  			It("creates and returns the task and all warnings", func() {
    44  				expectedTask := Task{
    45  					Command:    "some command",
    46  					Name:       "some-task-name",
    47  					MemoryInMB: 123,
    48  					DiskInMB:   321,
    49  				}
    50  				task, warnings, err := actor.RunTask("some-app-guid", expectedTask)
    51  				Expect(err).ToNot(HaveOccurred())
    52  
    53  				Expect(task).To(Equal(Task{
    54  					SequenceID: 3,
    55  				}))
    56  				Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
    57  
    58  				Expect(fakeCloudControllerClient.CreateApplicationTaskCallCount()).To(Equal(1))
    59  				appGUIDArg, taskArg := fakeCloudControllerClient.CreateApplicationTaskArgsForCall(0)
    60  				Expect(appGUIDArg).To(Equal("some-app-guid"))
    61  				Expect(taskArg).To(Equal(resources.Task(expectedTask)))
    62  			})
    63  		})
    64  
    65  		When("the cloud controller client returns an error", func() {
    66  			var warnings Warnings
    67  			var err error
    68  			var expectedErr error
    69  
    70  			JustBeforeEach(func() {
    71  				_, warnings, err = actor.RunTask("some-app-guid", Task{Command: "some command"})
    72  			})
    73  
    74  			When("the cloud controller error is generic", func() {
    75  				BeforeEach(func() {
    76  					expectedErr = errors.New("I am a CloudControllerClient Error")
    77  					fakeCloudControllerClient.CreateApplicationTaskReturns(
    78  						resources.Task{},
    79  						ccv3.Warnings{"warning-1", "warning-2"},
    80  						expectedErr,
    81  					)
    82  				})
    83  
    84  				It("returns the same error and all warnings", func() {
    85  					Expect(err).To(MatchError(expectedErr))
    86  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
    87  				})
    88  			})
    89  
    90  			When("the error is a TaskWorkersUnavailableError", func() {
    91  				BeforeEach(func() {
    92  					fakeCloudControllerClient.CreateApplicationTaskReturns(
    93  						resources.Task{},
    94  						ccv3.Warnings{"warning-1", "warning-2"},
    95  						ccerror.TaskWorkersUnavailableError{Message: "banana babans"},
    96  					)
    97  				})
    98  
    99  				It("returns a TaskWorkersUnavailableError and all warnings", func() {
   100  					Expect(err).To(MatchError(actionerror.TaskWorkersUnavailableError{Message: "banana babans"}))
   101  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   102  				})
   103  			})
   104  		})
   105  	})
   106  
   107  	Describe("GetApplicationTasks", func() {
   108  		When("the application exists", func() {
   109  			When("there are associated tasks", func() {
   110  				var (
   111  					task1 resources.Task
   112  					task2 resources.Task
   113  					task3 resources.Task
   114  				)
   115  
   116  				BeforeEach(func() {
   117  					task1 = resources.Task{
   118  						GUID:       "task-1-guid",
   119  						SequenceID: 1,
   120  						Name:       "task-1",
   121  						State:      constant.TaskSucceeded,
   122  						CreatedAt:  "some-time",
   123  						Command:    "some-command",
   124  					}
   125  					task2 = resources.Task{
   126  						GUID:       "task-2-guid",
   127  						SequenceID: 2,
   128  						Name:       "task-2",
   129  						State:      constant.TaskFailed,
   130  						CreatedAt:  "some-time",
   131  						Command:    "some-command",
   132  					}
   133  					task3 = resources.Task{
   134  						GUID:       "task-3-guid",
   135  						SequenceID: 3,
   136  						Name:       "task-3",
   137  						State:      constant.TaskRunning,
   138  						CreatedAt:  "some-time",
   139  						Command:    "some-command",
   140  					}
   141  					fakeCloudControllerClient.GetApplicationTasksReturns(
   142  						[]resources.Task{task3, task1, task2},
   143  						ccv3.Warnings{"warning-1", "warning-2"},
   144  						nil,
   145  					)
   146  				})
   147  
   148  				It("returns all tasks associated with the application and all warnings", func() {
   149  					tasks, warnings, err := actor.GetApplicationTasks("some-app-guid", Descending)
   150  					Expect(err).ToNot(HaveOccurred())
   151  
   152  					Expect(tasks).To(Equal([]Task{Task(task3), Task(task2), Task(task1)}))
   153  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   154  
   155  					tasks, warnings, err = actor.GetApplicationTasks("some-app-guid", Ascending)
   156  					Expect(err).ToNot(HaveOccurred())
   157  
   158  					Expect(tasks).To(Equal([]Task{Task(task1), Task(task2), Task(task3)}))
   159  					Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   160  
   161  					Expect(fakeCloudControllerClient.GetApplicationTasksCallCount()).To(Equal(2))
   162  					appGUID, query := fakeCloudControllerClient.GetApplicationTasksArgsForCall(0)
   163  					Expect(appGUID).To(Equal("some-app-guid"))
   164  					Expect(query).To(BeNil())
   165  				})
   166  			})
   167  
   168  			When("there are no associated tasks", func() {
   169  				BeforeEach(func() {
   170  					fakeCloudControllerClient.GetApplicationTasksReturns(
   171  						[]resources.Task{},
   172  						nil,
   173  						nil,
   174  					)
   175  				})
   176  
   177  				It("returns an empty list of tasks", func() {
   178  					tasks, _, err := actor.GetApplicationTasks("some-app-guid", Descending)
   179  					Expect(err).ToNot(HaveOccurred())
   180  					Expect(tasks).To(BeEmpty())
   181  				})
   182  			})
   183  		})
   184  
   185  		When("the cloud controller client returns an error", func() {
   186  			var expectedErr error
   187  
   188  			BeforeEach(func() {
   189  				expectedErr = errors.New("I am a CloudControllerClient Error")
   190  				fakeCloudControllerClient.GetApplicationTasksReturns(
   191  					[]resources.Task{},
   192  					ccv3.Warnings{"warning-1", "warning-2"},
   193  					expectedErr,
   194  				)
   195  			})
   196  
   197  			It("returns the same error and all warnings", func() {
   198  				_, warnings, err := actor.GetApplicationTasks("some-app-guid", Descending)
   199  				Expect(err).To(MatchError(expectedErr))
   200  				Expect(warnings).To(ConsistOf("warning-1", "warning-2"))
   201  			})
   202  		})
   203  	})
   204  
   205  	Describe("GetTaskBySequenceIDAndApplication", func() {
   206  		When("the cloud controller client does not return an error", func() {
   207  			When("the task is found", func() {
   208  				var task1 resources.Task
   209  
   210  				BeforeEach(func() {
   211  					task1 = resources.Task{
   212  						GUID:       "task-1-guid",
   213  						SequenceID: 1,
   214  					}
   215  					fakeCloudControllerClient.GetApplicationTasksReturns(
   216  						[]resources.Task{task1},
   217  						ccv3.Warnings{"get-task-warning-1"},
   218  						nil,
   219  					)
   220  				})
   221  
   222  				It("returns the task and warnings", func() {
   223  					task, warnings, err := actor.GetTaskBySequenceIDAndApplication(1, "some-app-guid")
   224  					Expect(err).ToNot(HaveOccurred())
   225  					Expect(task).To(Equal(Task(task1)))
   226  					Expect(warnings).To(ConsistOf("get-task-warning-1"))
   227  				})
   228  			})
   229  
   230  			When("the task is not found", func() {
   231  				BeforeEach(func() {
   232  					fakeCloudControllerClient.GetApplicationTasksReturns(
   233  						[]resources.Task{},
   234  						ccv3.Warnings{"get-task-warning-1"},
   235  						nil,
   236  					)
   237  				})
   238  
   239  				It("returns a TaskNotFoundError and warnings", func() {
   240  					_, warnings, err := actor.GetTaskBySequenceIDAndApplication(1, "some-app-guid")
   241  					Expect(err).To(MatchError(actionerror.TaskNotFoundError{SequenceID: 1}))
   242  					Expect(warnings).To(ConsistOf("get-task-warning-1"))
   243  				})
   244  			})
   245  		})
   246  
   247  		When("the cloud controller client returns an error", func() {
   248  			var expectedErr error
   249  
   250  			BeforeEach(func() {
   251  				expectedErr = errors.New("generic-error")
   252  				fakeCloudControllerClient.GetApplicationTasksReturns(
   253  					[]resources.Task{},
   254  					ccv3.Warnings{"get-task-warning-1"},
   255  					expectedErr,
   256  				)
   257  			})
   258  
   259  			It("returns the same error and warnings", func() {
   260  				_, warnings, err := actor.GetTaskBySequenceIDAndApplication(1, "some-app-guid")
   261  				Expect(err).To(Equal(expectedErr))
   262  				Expect(warnings).To(ConsistOf("get-task-warning-1"))
   263  			})
   264  		})
   265  	})
   266  
   267  	Describe("TerminateTask", func() {
   268  		When("the task exists", func() {
   269  			var returnedTask resources.Task
   270  
   271  			BeforeEach(func() {
   272  				returnedTask = resources.Task{
   273  					GUID:       "some-task-guid",
   274  					SequenceID: 1,
   275  				}
   276  				fakeCloudControllerClient.UpdateTaskCancelReturns(
   277  					returnedTask,
   278  					ccv3.Warnings{"update-task-warning"},
   279  					nil)
   280  			})
   281  
   282  			It("returns the task and warnings", func() {
   283  				task, warnings, err := actor.TerminateTask("some-task-guid")
   284  				Expect(err).NotTo(HaveOccurred())
   285  				Expect(warnings).To(ConsistOf("update-task-warning"))
   286  				Expect(task).To(Equal(Task(returnedTask)))
   287  			})
   288  		})
   289  
   290  		When("the cloud controller returns an error", func() {
   291  			var expectedErr error
   292  
   293  			BeforeEach(func() {
   294  				expectedErr = errors.New("cc-error")
   295  				fakeCloudControllerClient.UpdateTaskCancelReturns(
   296  					resources.Task{},
   297  					ccv3.Warnings{"update-task-warning"},
   298  					expectedErr)
   299  			})
   300  
   301  			It("returns the same error and warnings", func() {
   302  				_, warnings, err := actor.TerminateTask("some-task-guid")
   303  				Expect(err).To(MatchError(expectedErr))
   304  				Expect(warnings).To(ConsistOf("update-task-warning"))
   305  			})
   306  		})
   307  	})
   308  })