code: def provide_data(self):
          
          for service_name, service in self.services.items():
              service_ready = self.is_ready(service_name)
              for provider in service.get('provided_data', []):
                  for relid in hookenv.relation_ids(provider.name):
                      units = hookenv.related_units(relid)
                      if not units:
                          continue
                      remote_service = units[0].split('/')[0]
                      argspec = getargspec(provider.provide_data)
                      if len(argspec.args) > 1:
                          data = provider.provide_data(remote_service, service_ready)
                      else:
                          data = provider.provide_data()
                      if data:
                          hookenv.relation_set(relid, data)
docs: Set the relation data for each provider in the ``provided_data`` list.
  
          A provider must have a `name` attribute, which indicates which relation
          to set data on, and a `provide_data()` method, which returns a dict of
          data to set.
  
          The `provide_data()` method can optionally accept two parameters:
  
            * ``remote_service`` The name of the remote service that the data will
              be provided to.  The `provide_data()` method will be called once
              for each connected service (not unit).  This allows the method to
              tailor its data to the given service.
            * ``service_ready`` Whether or not the service definition had all of
              its requirements met, and thus the ``data_ready`` callbacks run.
  
          Note that the ``provided_data`` methods are now called **after** the
          ``data_ready`` callbacks are run.  This gives the ``data_ready`` callbacks
          a chance to generate any data necessary for the providing to the remote
          services.