Implement worker removal from the pool
authorAleksander Mistewicz <a.mistewicz@samsung.com>
Thu, 8 Jun 2017 12:51:47 +0000 (14:51 +0200)
committerMaciej Wereski <m.wereski@partner.samsung.com>
Wed, 20 Sep 2017 09:49:59 +0000 (11:49 +0200)
When Worker will not be used anymore, it should be removed in order
to free the resources. Administrator should first put Worker
in the MAINTENANCE state, using SetState, and then remove it,
using Deregister.

Change-Id: Ic9bb5e705418fae664857f3f541e9543ca7da9e2
Signed-off-by: Aleksander Mistewicz <a.mistewicz@samsung.com>
Reviewed-on: https://mcdsrvbld02.digital.local/review/49058
Reviewed-by: Maciej Wereski <m.wereski@partner.samsung.com>
Tested-by: Maciej Wereski <m.wereski@partner.samsung.com>
workers/error.go
workers/worker_list_test.go
workers/workers.go
workers/workers_test.go

index 1b0f7d6..bd51509 100644 (file)
@@ -30,4 +30,7 @@ var (
        ErrWorkerNotFound = errors.New("Worker is not present on the list")
        // ErrInMaintenance is returned when SetFail has been called for Worker in MAINTENANCE state.
        ErrInMaintenance = errors.New("It is forbidden to set FAIL state when Worker is in MAINTENANCE state")
+       // ErrNotInMaintenance is returned when Deregister is called for a worker not in MAINTENANCE state.
+       // Only workers in MAINTENANCE state can be removed from the list.
+       ErrNotInMaintenance = errors.New("Worker is not in MAINTENANCE state")
 )
index 562f452..2800cbf 100644 (file)
@@ -173,5 +173,37 @@ var _ = Describe("WorkerList", func() {
                                Expect(wl.workers[worker].State).To(Equal(MAINTENANCE))
                        })
                })
+
+               Describe("Deregister", func() {
+                       It("should fail to deregister nonexistent worker", func() {
+                               uuid := randomUUID()
+                               err := wl.Deregister(uuid)
+                               Expect(err).To(Equal(ErrWorkerNotFound))
+                       })
+
+                       It("should work to deregister", func() {
+                               err := wl.Deregister(worker)
+                               Expect(err).ToNot(HaveOccurred())
+                               Expect(wl.workers).ToNot(HaveKey(worker))
+                       })
+
+                       It("should fail to deregister same worker twice", func() {
+                               err := wl.Deregister(worker)
+                               Expect(err).ToNot(HaveOccurred())
+                               Expect(wl.workers).ToNot(HaveKey(worker))
+
+                               err = wl.Deregister(worker)
+                               Expect(err).To(Equal(ErrWorkerNotFound))
+                       })
+
+                       It("should fail to deregister worker not in MAINTENANCE state", func() {
+                               for _, state := range []WorkerState{IDLE, RUN, FAIL} {
+                                       wl.workers[worker].State = state
+                                       err := wl.Deregister(worker)
+                                       Expect(err).To(Equal(ErrNotInMaintenance))
+                                       Expect(wl.workers).To(HaveKey(worker))
+                               }
+                       })
+               })
        })
 })
index 3c27582..ff21f09 100644 (file)
@@ -88,7 +88,15 @@ func (wl *WorkerList) SetGroups(uuid WorkerUUID, groups Groups) error {
 
 // Deregister is an implementation of Deregister from Workers interface.
 func (wl *WorkerList) Deregister(uuid WorkerUUID) error {
-       return ErrNotImplemented
+       worker, ok := wl.workers[uuid]
+       if !ok {
+               return ErrWorkerNotFound
+       }
+       if worker.State != MAINTENANCE {
+               return ErrNotInMaintenance
+       }
+       delete(wl.workers, uuid)
+       return nil
 }
 
 // ListWorkers is an implementation of ListWorkers from Workers interface.
index c6cc3e6..dc2fed5 100644 (file)
@@ -46,10 +46,6 @@ var _ = Describe("WorkerList", func() {
                err = wl.SetGroups(uuid, groups)
                Expect(err).To(Equal(ErrNotImplemented))
 
-               By("Deregister")
-               err = wl.Deregister(uuid)
-               Expect(err).To(Equal(ErrNotImplemented))
-
                By("ListWorkers")
                _, err = wl.ListWorkers(groups, caps)
                Expect(err).To(Equal(ErrNotImplemented))