docstr: Clean up Job when it is finished
  
  :param rid: Resource ID to be free
  :type rid: int
  :param jid: Job ID
  :type jid: int
  :param score: score returned by Job (error case will be ERROR)
  :type score: float / str
  :param status: job status
  :type status: enumeration
docstr_tok: ["Clean","up","Job","when","it","is","finished",":","param","rid",":","Resource","ID","to","be","free",":","type","rid",":","int",":","param","jid",":","Job","ID",":","type","jid",":","int",":","param","score",":","score","returned","by","Job","(","error","case","will","be","ERROR",")",":","type","score",":","float","\/","str",":","param","status",":","job","status",":","type","status",":","enumeration"]
code: def job_finished(self, rid, jid, score=None, status=None):
      """
      Clean up Job when it is finished
  
      :param rid: Resource ID to be free
      :type rid: int
      :param jid: Job ID
      :type jid: int
      :param score: score returned by Job (error case will be ERROR)
      :type score: float / str
      :param status: job status
      :type status: enumeration
      """
      logger.debug(
          "Job %d is finished on %d, score is %s" % (jid, rid, score)
      )
      self.free_used_resource(rid)
      self.end_job_attempt(jid)
      self.end_job(jid, score, status)
  
imports: import abc
  import logging
label_desc: Use image node_id 18 for calling the AbstractConnector obj's underlying member method code with example usage: obj.job_finished(rid, jid, score, status) without return types