code: def check_configuration_string(
              self,
              config_string,
              is_job=True,
              external_name=False
      ):
          
          if is_job:
              self.log(u"Checking job configuration string")
          else:
              self.log(u"Checking task configuration string")
          self.result = ValidatorResult()
          if self._are_safety_checks_disabled(u"check_configuration_string"):
              return self.result
          if is_job:
              required_parameters = self.JOB_REQUIRED_PARAMETERS
          elif external_name:
              required_parameters = self.TASK_REQUIRED_PARAMETERS_EXTERNAL_NAME
          else:
              required_parameters = self.TASK_REQUIRED_PARAMETERS
          is_bstring = gf.is_bytes(config_string)
          if is_bstring:
              self.log(u"Checking that config_string is well formed")
              self.check_raw_string(config_string, is_bstring=True)
              if not self.result.passed:
                  return self.result
              config_string = gf.safe_unicode(config_string)
          self.log(u"Checking required parameters")
          parameters = gf.config_string_to_dict(config_string, self.result)
          self._check_required_parameters(required_parameters, parameters)
          self.log([u"Checking config_string: returning %s", self.result.passed])
          return self.result
docs: Check whether the given job or task configuration string
          is well-formed (if ``is_bstring`` is ``True``)
          and it has all the required parameters.
  
          :param string config_string: the byte string or Unicode string to be checked
          :param bool is_job: if ``True``, ``config_string`` is a job config string
          :param bool external_name: if ``True``, the task name is provided externally,
                                     and it is not required to appear
                                     in the config string
          :rtype: :class:`~aeneas.validator.ValidatorResult`