code: def update_metadata(self, loadbalancer, metadata, node=None):
          
          # Get the existing metadata
          md = self.get_metadata(loadbalancer, raw=True)
          id_lookup = dict([(itm["key"], itm["id"]) for itm in md])
          metadata_list = []
          # Updates must be done individually
          for key, val in metadata.items():
              try:
                  meta_id = id_lookup[key]
                  if node:
                      uri = "/loadbalancers/%s/nodes/%s/metadata/%s" % (
                              utils.get_id(loadbalancer), utils.get_id(node),
                              meta_id)
                  else:
                      uri = "/loadbalancers/%s/metadata" % utils.get_id(loadbalancer)
                  req_body = {"meta": {"value": val}}
                  resp, body = self.api.method_put(uri, body=req_body)
              except KeyError:
                  # Not an existing key; add to metadata_list
                  metadata_list.append({"key": key, "value": val})
          if metadata_list:
              # New items; POST them
              if node:
                  uri = "/loadbalancers/%s/nodes/%s/metadata" % (
                          utils.get_id(loadbalancer), utils.get_id(node))
              else:
                  uri = "/loadbalancers/%s/metadata" % utils.get_id(loadbalancer)
              req_body = {"metadata": metadata_list}
              resp, body = self.api.method_post(uri, body=req_body)
docs: Updates the existing metadata with the supplied dictionary. If
          'node' is supplied, the metadata for that node is updated instead
          of for the load balancer.