code: def incomplete_relation_data(configs, required_interfaces):
      
      complete_ctxts = configs.complete_contexts()
      incomplete_relations = [
          svc_type
          for svc_type, interfaces in required_interfaces.items()
          if not set(interfaces).intersection(complete_ctxts)]
      return {
          i: configs.get_incomplete_context_data(required_interfaces[i])
          for i in incomplete_relations}
docs: Check complete contexts against required_interfaces
      Return dictionary of incomplete relation data.
  
      configs is an OSConfigRenderer object with configs registered
  
      required_interfaces is a dictionary of required general interfaces
      with dictionary values of possible specific interfaces.
      Example:
      required_interfaces = {'database': ['shared-db', 'pgsql-db']}
  
      The interface is said to be satisfied if anyone of the interfaces in the
      list has a complete context.
  
      Return dictionary of incomplete or missing required contexts with relation
      status of interfaces and any missing data points. Example:
          {'message':
               {'amqp': {'missing_data': ['rabbitmq_password'], 'related': True},
                'zeromq-configuration': {'related': False}},
           'identity':
               {'identity-service': {'related': False}},
           'database':
               {'pgsql-db': {'related': False},
                'shared-db': {'related': True}}}