docs: def _ows_check_generic_interfaces(configs, required_interfaces):
      """Check the complete contexts to determine the workload status.
  
       - Checks for missing or incomplete contexts
       - juju log details of missing required data.
       - determines the correct workload status
       - creates an appropriate message for status_set(...)
  
      if there are no problems then the function returns None, None
  
      @param configs: a templating.OSConfigRenderer() object
      @params required_interfaces: {generic_interface: [specific_interface], }
      @returns state, message or None, None
      """
      incomplete_rel_data = incomplete_relation_data(configs,
                                                     required_interfaces)
      state = None
      message = None
      missing_relations = set()
      incomplete_relations = set()
  
      for generic_interface, relations_states in incomplete_rel_data.items():
          related_interface = None
          missing_data = {}
          # Related or not?
          for interface, relation_state in relations_states.items():
              if relation_state.get('related'):
                  related_interface = interface
                  missing_data = relation_state.get('missing_data')
                  break
          # No relation ID for the generic_interface?
          if not related_interface:
              juju_log("{} relation is missing and must be related for "
                       "functionality. ".format(generic_interface), 'WARN')
              state = 'blocked'
              missing_relations.add(generic_interface)
          else:
              # Relation ID eists but no related unit
              if not missing_data:
                  # Edge case - relation ID exists but departings
                  _hook_name = hook_name()
                  if (('departed' in _hook_name or 'broken' in _hook_name) and
                          related_interface in _hook_name):
                      state = 'blocked'
                      missing_relations.add(generic_interface)
                      juju_log("{} relation's interface, {}, "
                               "relationship is departed or broken "
                               "and is required for functionality."
                               "".format(generic_interface, related_interface),
                               "WARN")
                  # Normal case relation ID exists but no related unit
                  # (joining)
                  else:
                      juju_log("{} relations's interface, {}, is related but has"
                               " no units in the relation."
                               "".format(generic_interface, related_interface),
                               "INFO")
              # Related unit exists and data missing on the relation
              else:
                  juju_log("{} relation's interface, {}, is related awaiting "
                           "the following data from the relationship: {}. "
                           "".format(generic_interface, related_interface,
                                     ", ".join(missing_data)), "INFO")
              if state != 'blocked':
                  state = 'waiting'
              if generic_interface not in missing_relations:
                  incomplete_relations.add(generic_interface)
  
      if missing_relations:
          message = "Missing relations: {}".format(", ".join(missing_relations))
          if incomplete_relations:
              message += "; incomplete relations: {}" \
                         "".format(", ".join(incomplete_relations))
          state = 'blocked'
      elif incomplete_relations:
          message = "Incomplete relations: {}" \
                    "".format(", ".join(incomplete_relations))
          state = 'waiting'
  
      return state, message