autotest: remove backup role for servers.

Also previously unittest is not running. This CL fixes it.

BUG=chromium:789784
TEST=Ran unittest.

Change-Id: Ic380c2832e53f782d3bc888f7d503e41349868ff
Reviewed-on: https://chromium-review.googlesource.com/797219
Commit-Ready: ChromeOS CL Exonerator Bot <[email protected]>
Tested-by: Xixuan Wu <[email protected]>
Reviewed-by: Aviv Keshet <[email protected]>
diff --git a/frontend/server/models.py b/frontend/server/models.py
index 4b2c52d..b6ee1cd 100644
--- a/frontend/server/models.py
+++ b/frontend/server/models.py
@@ -24,7 +24,7 @@
                   'Date Modified: %(date_modified)s\n'
                   'Note         : %(note)s\n')
 
-    STATUS_LIST = ['primary', 'backup', 'repair_required']
+    STATUS_LIST = ['primary', 'repair_required']
     STATUS = enum.Enum(*STATUS_LIST, string_values=True)
 
     hostname = dbmodels.CharField(unique=True, max_length=128)
@@ -72,7 +72,7 @@
         For example:
         {
             'hostname': 'server1',
-            'status': 'backup',
+            'status': 'primary',
             'roles': ['drone', 'scheduler'],
             'attributes': {'max_processes': 300}
         }
@@ -99,11 +99,6 @@
                  'database', 'database_slave', 'suite_scheduler',
                  'crash_server', 'shard', 'golo_proxy', 'sentinel', 'reserve']
     ROLE = enum.Enum(*ROLE_LIST, string_values=True)
-    # When deleting any of following roles from a primary server, a working
-    # backup must be available if user_server_db is enabled in global config.
-    ROLES_REQUIRE_BACKUP = [ROLE.SCHEDULER, ROLE.HOST_SCHEDULER,
-                            ROLE.DATABASE, ROLE.SUITE_SCHEDULER,
-                            ROLE.DRONE]
     # Roles that must be assigned to a single primary server in an Autotest
     # instance
     ROLES_REQUIRE_UNIQUE_INSTANCE = [ROLE.SCHEDULER,
@@ -148,7 +143,7 @@
     2. hostname. The code will try to resolve given hostname. If the hostname
        does not exist in the network, InvalidDataError will be raised.
     Sample usage of this function:
-    validate(role='drone', status='backup', hostname='server1')
+    validate(role='drone', status='repair_required', hostname='server1')
 
     @param kwargs: command line arguments, e.g., `status='primary'`
     @raise InvalidDataError: If any argument value is invalid.
diff --git a/site_utils/server_manager.py b/site_utils/server_manager.py
index 76e96f3..5a7d183 100644
--- a/site_utils/server_manager.py
+++ b/site_utils/server_manager.py
@@ -6,11 +6,10 @@
 (defined in global config section AUTOTEST_SERVER_DB).
 
 create(hostname, role=None, note=None)
-    Create a server with given role, with status backup.
+    Create a server with given role, with status primary.
 
 delete(hostname)
-    Delete a server from the database. If the server is in primary status, its
-    roles will be replaced by a backup server first.
+    Delete a server from the database.
 
 modify(hostname, role=None, status=None, note=None, delete=False,
        attribute=None, value=None)
@@ -109,14 +108,9 @@
     server_manager_actions.try_execute(server, [role], enable=False,
                                        post_change=True, do_action=action)
 
-    # If the server is in status primary and has no role, change its status to
-    # backup.
     if (not server.get_role_names() and
         server.status == server_models.Server.STATUS.PRIMARY):
-        print ('Server %s has no role, change its status from primary to backup'
-               % server.hostname)
-        server.status = server_models.Server.STATUS.BACKUP
-        server.save()
+        print ('Server %s has no role.')
 
     print 'Role %s is deleted from server %s.' % (role, server.hostname)
 
@@ -144,8 +138,8 @@
 
     # Abort the action if the server's status will be changed to primary and
     # the Autotest instance already has another server running an unique role.
-    # For example, a scheduler server is already running, and a backup server
-    # with role scheduler should not be changed to status primary.
+    # For example, a scheduler server is already running, and a repair_required
+    # server with role scheduler should not be changed to status primary.
     unique_roles = server.roles.filter(
             role__in=server_models.ServerRole.ROLES_REQUIRE_UNIQUE_INSTANCE)
     if unique_roles and status == server_models.Server.STATUS.PRIMARY:
@@ -190,9 +184,7 @@
 def create(hostname, role=None, note=None):
     """Create a new server.
 
-    The status of new server will always be backup, user need to call
-    atest server modify hostname --status primary
-    to set the server's status to primary.
+    The status of new server will always be primary.
 
     @param hostname: hostname of the server.
     @param role: role of the new server, default to None.
@@ -202,7 +194,7 @@
     """
     server_models.validate(hostname=hostname, role=role)
     server = server_models.Server.objects.create(
-            hostname=hostname, status=server_models.Server.STATUS.BACKUP,
+            hostname=hostname, status=server_models.Server.STATUS.PRIMARY,
             note=note, date_created=datetime.datetime.now())
     server_models.ServerRole.objects.create(server=server, role=role)
     return server
@@ -217,7 +209,7 @@
                    injected by the verify_server_exists decorator.
 
     @raise ServerActionError: If delete server action failed, e.g., server is
-            not found in database or server is primary but no backup is found.
+            not found in database.
     """
     print 'Deleting server %s from server database.' % hostname
 
diff --git a/site_utils/server_manager_actions.py b/site_utils/server_manager_actions.py
index 13c0d31..f021f17 100644
--- a/site_utils/server_manager_actions.py
+++ b/site_utils/server_manager_actions.py
@@ -107,7 +107,7 @@
 
 
 def try_execute(server, roles, enable, post_change,
-                prev_status=server_models.Server.STATUS.BACKUP,
+                prev_status=server_models.Server.STATUS.REPAIR_REQUIRED,
                 do_action=False):
     """Try to execute actions for given role changes of the server.
 
@@ -121,7 +121,7 @@
                         is to help to decide if actions should be executed,
                         since actions should be applied if the server's status
                         is changed from primary to other status. Default to
-                        backup.
+                        repair_required.
     @param do_action: Set to True to execute actions, otherwise, post a warning.
     """
     if not server_manager_utils.use_server_db():
@@ -134,6 +134,7 @@
         prev_status != server_models.Server.STATUS.PRIMARY):
         return
 
+    possible_actions = {}
     if enable:
         if post_change:
             possible_actions = ACTIONS_AFTER_ROLE_APPLIED
diff --git a/site_utils/server_manager_unittest.py b/site_utils/server_manager_unittest.py
index cbc87d3..a060ef2 100644
--- a/site_utils/server_manager_unittest.py
+++ b/site_utils/server_manager_unittest.py
@@ -64,10 +64,10 @@
                        'status': server_models.Server.STATUS.PRIMARY,
                        'roles': QueriableList([self.DRONE_ROLE]),
                        'attributes': QueriableList([self.DRONE_ATTRIBUTE])})
-        self.BACKUP_DRONE = mox.MockObject(
+        self.REPAIR_REQUIRED_DRONE = mox.MockObject(
                 server_models.Server,
-                attrs={'hostname': 'backup_drone_hostname',
-                       'status': server_models.Server.STATUS.BACKUP,
+                attrs={'hostname': 'repair_required_drone_hostname',
+                       'status': server_models.Server.STATUS.REPAIR_REQUIRED,
                        'roles': QueriableList([self.DRONE_ROLE]),
                        'attributes': QueriableList([self.DRONE_ATTRIBUTE])})
         self.PRIMARY_SCHEDULER = mox.MockObject(
@@ -76,10 +76,10 @@
                        'status': server_models.Server.STATUS.PRIMARY,
                        'roles': QueriableList([self.SCHEDULER_ROLE]),
                        'attributes': QueriableList([])})
-        self.BACKUP_SCHEDULER = mox.MockObject(
+        self.REPAIR_REQUIRED_SCHEDULER = mox.MockObject(
                 server_models.Server,
-                attrs={'hostname': 'backup_scheduler_hostname',
-                       'status': server_models.Server.STATUS.BACKUP,
+                attrs={'hostname': 'repair_required_scheduler_hostname',
+                       'status': server_models.Server.STATUS.REPAIR_REQUIRED,
                        'roles': QueriableList([self.SCHEDULER_ROLE]),
                        'attributes': QueriableList([])})
 
@@ -104,25 +104,25 @@
     def testCreateServerSuccess(self):
         """Test create method can create a server successfully.
         """
-        ping_runner.PingRunner().simple_ping(self.BACKUP_DRONE.hostname
+        ping_runner.PingRunner().simple_ping(self.PRIMARY_DRONE.hostname
                                              ).AndReturn(True)
         server_models.Server.objects.get(
-                hostname=self.BACKUP_DRONE.hostname
+                hostname=self.PRIMARY_DRONE.hostname
                 ).AndRaise(django.core.exceptions.ObjectDoesNotExist)
         server_models.Server.objects.create(
                 hostname=mox.IgnoreArg(), status=mox.IgnoreArg(),
                 date_created=mox.IgnoreArg(), note=mox.IgnoreArg()
-                ).AndReturn(self.BACKUP_DRONE)
+                ).AndReturn(self.PRIMARY_DRONE)
         server_models.ServerRole.objects.create(
                 server=mox.IgnoreArg(), role=server_models.ServerRole.ROLE.DRONE
                 ).AndReturn(self.DRONE_ROLE)
         self.mox.ReplayAll()
-        drone = server_manager.create(hostname=self.BACKUP_DRONE.hostname,
+        drone = server_manager.create(hostname=self.PRIMARY_DRONE.hostname,
                                       role=server_models.ServerRole.ROLE.DRONE)
 
 
-    def testAddRoleToBackupSuccess(self):
-        """Test manager can add a role to a backup server successfully.
+    def testAddRoleToRepairRequiredSuccess(self):
+        """Test manager can add a role to a repair_failed server successfully.
 
         Confirm that database call is made, and no action is taken, e.g.,
         restart scheduler to activate a new devserver.
@@ -132,37 +132,38 @@
                                           mox.IgnoreArg()).AndReturn(True)
         server_manager_utils.use_server_db().MultipleTimes(
                 ).AndReturn(True)
-        self.mox.StubOutWithMock(self.BACKUP_DRONE, 'get_role_names')
-        self.BACKUP_DRONE.get_role_names().AndReturn(
+        self.mox.StubOutWithMock(self.REPAIR_REQUIRED_DRONE, 'get_role_names')
+        self.REPAIR_REQUIRED_DRONE.get_role_names().AndReturn(
                 [server_models.ServerRole.ROLE.DRONE])
         server_models.ServerRole.objects.create(
                 server=mox.IgnoreArg(),
                 role=server_models.ServerRole.ROLE.DEVSERVER
                 ).AndReturn(self.DRONE_ROLE)
         self.mox.ReplayAll()
-        server_manager._add_role(server=self.BACKUP_DRONE,
+        server_manager._add_role(server=self.REPAIR_REQUIRED_DRONE,
                                  role=server_models.ServerRole.ROLE.DEVSERVER,
                                  action=True)
 
 
-    def testAddRoleToBackupFail_RoleAlreadyExists(self):
-        """Test manager fails to add a role to a backup server if server already
-        has the given role.
+    def testAddRoleToRepairRequiredFail_RoleAlreadyExists(self):
+        """Test manager fails to add a role to a repair_required server if
+        server already has the given role.
         """
         server_models.validate(role=server_models.ServerRole.ROLE.DRONE)
-        self.mox.StubOutWithMock(self.BACKUP_DRONE, 'get_role_names')
-        self.BACKUP_DRONE.get_role_names().AndReturn(
+        self.mox.StubOutWithMock(self.REPAIR_REQUIRED_DRONE, 'get_role_names')
+        self.REPAIR_REQUIRED_DRONE.get_role_names().AndReturn(
                 [server_models.ServerRole.ROLE.DRONE])
         self.mox.ReplayAll()
         self.assertRaises(server_manager_utils.ServerActionError,
                           server_manager._add_role,
-                          server=self.BACKUP_DRONE,
+                          server=self.REPAIR_REQUIRED_DRONE,
                           role=server_models.ServerRole.ROLE.DRONE,
                           action=True)
 
 
-    def testDeleteRoleFromBackupSuccess(self):
-        """Test manager can delete a role from a backup server successfully.
+    def testDeleteRoleFromRepairRequiredSuccess(self):
+        """Test manager can delete a role from a repair_required server
+        successfully.
 
         Confirm that database call is made, and no action is taken, e.g.,
         restart scheduler to delete an existing devserver.
@@ -170,45 +171,47 @@
         server_models.validate(role=server_models.ServerRole.ROLE.DRONE)
         server_manager_utils.use_server_db().MultipleTimes(
                 ).AndReturn(True)
-        self.mox.StubOutWithMock(self.BACKUP_DRONE, 'get_role_names')
-        self.BACKUP_DRONE.get_role_names().MultipleTimes().AndReturn(
+        self.mox.StubOutWithMock(self.REPAIR_REQUIRED_DRONE, 'get_role_names')
+        self.REPAIR_REQUIRED_DRONE.get_role_names().MultipleTimes().AndReturn(
                 [server_models.ServerRole.ROLE.DRONE])
-        self.mox.StubOutWithMock(self.BACKUP_DRONE.roles, 'get')
-        self.BACKUP_DRONE.roles.get(
+        self.mox.StubOutWithMock(self.REPAIR_REQUIRED_DRONE.roles, 'get')
+        self.REPAIR_REQUIRED_DRONE.roles.get(
                 role=server_models.ServerRole.ROLE.DRONE
                 ).AndReturn(self.DRONE_ROLE)
         self.mox.ReplayAll()
-        server_manager._delete_role(server=self.BACKUP_DRONE,
+        server_manager._delete_role(server=self.REPAIR_REQUIRED_DRONE,
                                     role=server_models.ServerRole.ROLE.DRONE,
                                     action=True)
 
 
-    def testDeleteRoleFromBackupFail_RoleNotExist(self):
-        """Test manager fails to delete a role from a backup server if the
-        server does not have the given role.
+    def testDeleteRoleFromRepairRequiredFail_RoleNotExist(self):
+        """Test manager fails to delete a role from a repair_required server if
+        the server does not have the given role.
         """
         server_models.validate(role=server_models.ServerRole.ROLE.DEVSERVER)
-        self.mox.StubOutWithMock(self.BACKUP_DRONE, 'get_role_names')
-        self.BACKUP_DRONE.get_role_names().AndReturn(
+        self.mox.StubOutWithMock(self.REPAIR_REQUIRED_DRONE, 'get_role_names')
+        self.REPAIR_REQUIRED_DRONE.get_role_names().AndReturn(
                 [server_models.ServerRole.ROLE.DRONE])
         self.mox.ReplayAll()
         self.assertRaises(server_manager_utils.ServerActionError,
-                          server_manager._delete_role, server=self.BACKUP_DRONE,
+                          server_manager._delete_role,
+                          server=self.REPAIR_REQUIRED_DRONE,
                           role=server_models.ServerRole.ROLE.DEVSERVER,
                           action=True)
 
 
-    def testChangeStatusSuccess_BackupToPrimary(self):
-        """Test manager can change the status of a backup server to primary.
+    def testChangeStatusSuccess_RepairFailedToPrimary(self):
+        """Test manager can change the status of a repair_required server to
+        primary.
         """
         server_models.validate(status=server_models.Server.STATUS.PRIMARY)
         server_manager_utils.use_server_db().MultipleTimes(
                 ).AndReturn(True)
-        self.mox.StubOutWithMock(self.BACKUP_DRONE, 'get_role_names')
-        self.BACKUP_DRONE.get_role_names().MultipleTimes().AndReturn(
+        self.mox.StubOutWithMock(self.REPAIR_REQUIRED_DRONE, 'get_role_names')
+        self.REPAIR_REQUIRED_DRONE.get_role_names().MultipleTimes().AndReturn(
                 [server_models.ServerRole.ROLE.DRONE])
-        self.mox.StubOutWithMock(self.BACKUP_DRONE.roles, 'filter')
-        self.BACKUP_DRONE.roles.filter(
+        self.mox.StubOutWithMock(self.REPAIR_REQUIRED_DRONE.roles, 'filter')
+        self.REPAIR_REQUIRED_DRONE.roles.filter(
                 role__in=server_models.ServerRole.ROLES_REQUIRE_UNIQUE_INSTANCE
                 ).AndReturn(None)
         server_models.Server.objects.filter(
@@ -218,15 +221,17 @@
         infra.execute_command(mox.IgnoreArg(), mox.IgnoreArg())
         self.mox.ReplayAll()
         server_manager._change_status(
-                server=self.BACKUP_DRONE,
+                server=self.REPAIR_REQUIRED_DRONE,
                 status=server_models.Server.STATUS.PRIMARY,
                 action=True)
 
 
-    def testChangeStatusSuccess_PrimaryToBackup(self):
-        """Test manager can change the status of a primary server to backup.
+    def testChangeStatusSuccess_PrimaryToRepairFailed(self):
+        """Test manager can change the status of a primary server to
+        repair_required.
         """
-        server_models.validate(status=server_models.Server.STATUS.BACKUP)
+        server_models.validate(
+                status=server_models.Server.STATUS.REPAIR_REQUIRED)
         self.mox.StubOutWithMock(self.PRIMARY_DRONE.roles, 'filter')
         self.mox.StubOutWithMock(self.PRIMARY_DRONE, 'get_role_names')
         self.PRIMARY_DRONE.get_role_names().MultipleTimes().AndReturn(
@@ -245,7 +250,7 @@
         self.mox.ReplayAll()
         server_manager._change_status(
                 server=self.PRIMARY_DRONE,
-                status=server_models.Server.STATUS.BACKUP,
+                status=server_models.Server.STATUS.REPAIR_REQUIRED,
                 action=True)
 
 
@@ -253,23 +258,24 @@
         """Test manager cannot change the status of a server with the same
         status.
         """
-        server_models.validate(status=server_models.Server.STATUS.BACKUP)
+        server_models.validate(
+                status=server_models.Server.STATUS.REPAIR_REQUIRED)
         self.mox.ReplayAll()
         self.assertRaises(server_manager_utils.ServerActionError,
                           server_manager._change_status,
-                          server=self.BACKUP_DRONE,
-                          status=server_models.Server.STATUS.BACKUP,
+                          server=self.REPAIR_REQUIRED_DRONE,
+                          status=server_models.Server.STATUS.REPAIR_REQUIRED,
                           action=True)
 
 
     def testChangeStatusFail_UniqueInstance(self):
-        """Test manager cannot change the status of a server from backup to
-        primary if there is already a primary exists for role doesn't allow
-        multiple instances.
+        """Test manager cannot change the status of a server from
+        repair_required to primary if there is already a primary exists for
+        role doesn't allow multiple instances.
         """
         server_models.validate(status=server_models.Server.STATUS.PRIMARY)
-        self.mox.StubOutWithMock(self.BACKUP_SCHEDULER.roles, 'filter')
-        self.BACKUP_SCHEDULER.roles.filter(
+        self.mox.StubOutWithMock(self.REPAIR_REQUIRED_SCHEDULER.roles, 'filter')
+        self.REPAIR_REQUIRED_SCHEDULER.roles.filter(
                 role__in=server_models.ServerRole.ROLES_REQUIRE_UNIQUE_INSTANCE
                 ).AndReturn(QueriableList([self.SCHEDULER_ROLE]))
         server_models.Server.objects.filter(
@@ -279,24 +285,25 @@
         self.mox.ReplayAll()
         self.assertRaises(server_manager_utils.ServerActionError,
                           server_manager._change_status,
-                          server=self.BACKUP_SCHEDULER,
+                          server=self.REPAIR_REQUIRED_SCHEDULER,
                           status=server_models.Server.STATUS.PRIMARY,
                           action=True)
 
 
-    def testAddRoleToBackupFail_CheckServerFail(self):
-        """Test manager fails to add a role to a backup server if check_server
-        is failed.
+    def testAddRoleToRepairFailedFail_CheckServerFail(self):
+        """Test manager fails to add a role to a repair_required server if check
+        server is failed.
         """
         server_manager_utils.check_server(mox.IgnoreArg(),
                                           mox.IgnoreArg()).AndReturn(False)
         server_models.validate(role=server_models.ServerRole.ROLE.DRONE)
-        self.mox.StubOutWithMock(self.BACKUP_DRONE, 'get_role_names')
-        self.BACKUP_DRONE.get_role_names().MultipleTimes().AndReturn(
+        self.mox.StubOutWithMock(self.REPAIR_REQUIRED_DRONE, 'get_role_names')
+        self.REPAIR_REQUIRED_DRONE.get_role_names().MultipleTimes().AndReturn(
                 [server_models.ServerRole.ROLE.DRONE])
         self.mox.ReplayAll()
         self.assertRaises(server_manager_utils.ServerActionError,
-                          server_manager._add_role, server=self.BACKUP_DRONE,
+                          server_manager._add_role,
+                          server=self.REPAIR_REQUIRED_DRONE,
                           role=server_models.ServerRole.ROLE.SCHEDULER,
                           action=True)
 
@@ -384,5 +391,5 @@
                                     action=False)
 
 
-if '__main__':
+if __name__ == "__main__":
     unittest.main()