def execute( self ):
        " Should return True if the execution completed successfully "
        self.fromScratch()

        self.ns.connect( 10 )
        self.ns.directLogin( 'TEST',
                             'netschedule_admin client_node=n1 '
                             'client_session=s1 control_port=732 '
                             'client_host=myhost' )
        self.ns.directSendCmd( 'AFLS' )
        reply = self.ns.directReadSingleReply()
        self.ns.disconnect()

        ns_admin = self.getNetScheduleService( 'TEST', 'scenario313' )
        info = getClientInfo( ns_admin, 'n1' )
        if info[ 'worker_node_control_port' ] != 732 or \
           info[ 'client_host' ] != 'myhost':
            raise Exception( "Unexpected client control "
                             "port and/or client host" )

        # Second connect to remove control port and host
        self.ns.connect( 10 )
        self.ns.directLogin( 'TEST',
                             'netschedule_admin client_node=n1 '
                             'client_session=s1' )
        self.ns.directSendCmd( 'AFLS' )
        reply = self.ns.directReadSingleReply()     # analysis:ignore
        self.ns.disconnect()
        info = getClientInfo( ns_admin, 'n1' )
        if info[ 'worker_node_control_port' ] != 'n/a' or \
           info[ 'client_host' ] != 'n/a':
            raise Exception( "Unexpected cleared client control "
                             "port and/or client host" )
        return True
    def execute(self):
        " Should return True if the execution completed successfully "
        self.fromScratch(5)
        origJobID = self.ns.submitJob("TEST", "bla")

        jobID, authToken, attrs, jobInput = self.ns.getJob("TEST", -1, "", "", "node1", "session1")
        self.ns.failJob("TEST", jobID, authToken, 4, "blah-out", "blah-err", "node1", "session1")

        # Check that the job is in the blacklist for this client
        ns_client = self.getNetScheduleService("TEST", "scenario109")
        client = getClientInfo(ns_client, "node1")

        if "blacklisted_jobs" not in client:
            raise Exception("No blacklisted jobs found")
        if len(client["blacklisted_jobs"]) != 1:
            raise Exception("Unexpected number of blacklisted jobs")
        if client["blacklisted_jobs"][0].split()[0] != jobID:
            raise Exception("Unexpected job is in the blacklist")

        # wait till the job is gone from the blacklist
        time.sleep(6)

        # There is no more GET, but the job must not be in the blacklist

        # Check the blacklist again
        client = getClientInfo(ns_client, "node1")
        if "number_of_blacklisted_jobs" not in client:
            raise Exception("Expected no jobs in the blacklist, got something")
        if client["number_of_blacklisted_jobs"] != 0:
            raise Exception("Unexpected # of the blacklisted jobs. Expected 0.")

        return True
    def execute( self ):
        " Should return True if the execution completed successfully "
        self.fromScratch()

        # First client holds a0 affinity
        ns_client = self.getNetScheduleService( 'TEST', 'scenario311' )
        ns_client.set_client_identification( 'node1', 'session1' )
        changeAffinity( ns_client, [ 'a0' ], [] )

        ns_admin = self.getNetScheduleService( 'TEST', 'scenario310' )

        affInfo = getAffinityInfo( ns_admin )
        if affInfo[ 'affinity_token' ] != 'a0':
            raise Exception( "Unexpected affinity registry content "
                             "after adding 1 preferred affinity (token)" )
        if 'clients__preferred' in affInfo:
            if affInfo[ 'clients__preferred' ] != [ 'node1' ]:
                raise Exception( "Unexpected affinity registry content "
                                "after adding 1 preferred affinity (node)" )
        if 'wn_clients__preferred' in affInfo:
            if affInfo[ 'wn_clients__preferred' ] != [ 'node1' ]:
                raise Exception( "Unexpected affinity registry content "
                                "after adding 1 preferred affinity (node)" )
        info = getClientInfo( ns_admin, 'node1' )
        if info[ 'preferred_affinities_reset' ] != False:
            raise Exception( "Expected to have preferred affinities non reset, "
                             "received: " +
                             str( info[ 'preferred_affinities_reset' ] ) )

        # Worker node timeout is 5 sec
        time.sleep( 7 )

        info = getClientInfo( ns_admin, 'node1' )
        if info[ 'preferred_affinities_reset' ] != True:
            raise Exception( "Expected to have preferred affinities reset, "
                             "received: " +
                             str( info[ 'preferred_affinities_reset' ] ) )

        affInfo = getAffinityInfo( ns_admin )
        if affInfo[ 'affinity_token' ] != 'a0':
            raise Exception( "Unexpected affinity registry content "
                             "after worker node is expired (token)" )
        if 'clients__preferred' in affInfo:
            if affInfo[ 'clients__preferred' ] != None:
                raise Exception( "Unexpected affinity registry content "
                                 "after worker node is expired (node)" )
        if 'wn_clients__preferred' in affInfo:
            if affInfo[ 'wn_clients__preferred' ] != None:
                raise Exception( "Unexpected affinity registry content "
                                 "after worker node is expired (node)" )

        try:
            output = execAny( ns_client,
                              'GET2 wnode_aff=1 any_aff=0 exclusive_new_aff=1' )
        except Exception, excpt:
            if "ePrefAffExpired" in str( excpt ) or "expired" in str( excpt ):
                return True
            raise
    def execute(self):
        " Should return True if the execution completed successfully "
        self.fromScratch(7)

        ns_client = self.getNetScheduleService("TEST", "scenario603")
        ns_client.set_client_identification("mynode", "mysession")
        changeAffinity(ns_client, ["a1", "a2"], [])

        client = getClientInfo(ns_client, "mynode", verbose=False)
        if client["preferred_affinities_reset"] != False:
            raise Exception("Expected non-resetted preferred affinities")

        # wait till the worker node is expired
        time.sleep(12)

        client = getClientInfo(ns_client, "mynode", verbose=False)
        if client["preferred_affinities_reset"] != True:
            raise Exception("Expected resetted preferred affinities")
        if client["number_of_preferred_affinities"] != 0:
            raise Exception("Unexpected length of preferred_affinities")

        execAny(ns_client, "SETAFF")
        client = getClientInfo(ns_client, "mynode", verbose=False)

        if client["preferred_affinities_reset"] != False:
            raise Exception("Expected non-resetted preferred affinities" " after SETAFF")
        if client["number_of_preferred_affinities"] != 0:
            raise Exception("Unexpected length of preferred_affinities")

        execAny(ns_client, "SETAFF a4,a7")
        client = getClientInfo(ns_client, "mynode", verbose=False)
        if client["preferred_affinities_reset"] != False:
            raise Exception("Expected non-resetted preferred affinities" " after SETAFF")
        if client["number_of_preferred_affinities"] != 2:
            raise Exception("Unexpected length of preferred_affinities")

        return True
    def execute( self ):
        " Should return True if the execution completed successfully "
        self.fromScratch()

        # First client holds a0 affinity
        ns_client = self.getNetScheduleService( 'TEST', 'scenario312' )
        ns_client.set_client_identification( 'node1', 'session1' )
        changeAffinity( ns_client, [ 'a0' ], [] )

        ns_admin = self.getNetScheduleService( 'TEST', 'scenario312' )

        execAny( ns_client,
                 'GET2 wnode_aff=1 any_aff=0 exclusive_new_aff=0 '
                 'port=9007 timeout=4' )

        info = getNotificationInfo( ns_admin )
        if info[ 'client_node' ] != 'node1':
            raise Exception( "Unexpected client in the notifications list: " +
                             info[ 'client_node' ] )

        # Worker node timeout is 5 sec
        time.sleep( 7 )

        info = getClientInfo( ns_admin, 'node1' )
        if info[ 'preferred_affinities_reset' ] != True:
            raise Exception( "Expected to have preferred affinities reset, "
                             "received: " +
                             str( info[ 'preferred_affinities_reset' ] ) )

        affInfo = getAffinityInfo( ns_admin )
        if affInfo[ 'affinity_token' ] != 'a0':
            raise Exception( "Unexpected affinity registry content "
                             "after worker node is expired (token)" )
        if 'clients__preferred' in affInfo:
            if affInfo[ 'clients__preferred' ] != None:
                raise Exception( "Unexpected affinity registry content "
                                 "after worker node is expired (node)" )
        if 'wn_clients__preferred' in affInfo:
            if affInfo[ 'wn_clients__preferred' ] != None:
                raise Exception( "Unexpected affinity registry content "
                                 "after worker node is expired (node)" )


        if getNotificationInfo( ns_admin, True, 0 ) != None:
            raise Exception( "Expected no notification, got some" )

        return True
    def execute( self ):
        " Should return True if the execution completed successfully "
        self.fromScratch()

        # First client holds a0 affinity
        ns_client = self.getNetScheduleService( 'TEST', 'scenario310' )
        ns_client.set_client_identification( 'node1', 'session1' )
        changeAffinity( ns_client, [ 'a0' ], [] )

        # Worker node timeout is 5 sec
        time.sleep( 7 )

        ns_admin = self.getNetScheduleService( 'TEST', 'scenario310' )
        info = getClientInfo( ns_admin, 'node1' )
        if info[ 'preferred_affinities_reset' ] != True:
            raise Exception( "Expected to have preferred affinities reset, "
                             "received: " +
                             str( info[ 'preferred_affinities_reset' ] ) )
        return True