/**
   * Get node scope properties UpgradeManager will publish the node scope properties as node
   * information into coordinator Node scope properties are invariants.
   *
   * <p>We check to see if a property is in metadata or not. If it is, it is a target property; If
   * not, it is a local property
   *
   * @param localPropInfo local property info read from /etc/config.properties
   * @return node scope properties
   */
  private PropertyInfoExt getNodeScopeProperties(final PropertyInfoExt localPropInfo) {
    Map<String, PropertyMetadata> metadata = PropertiesMetadata.getGlobalMetadata();
    PropertyInfoExt localScopeProps = new PropertyInfoExt();

    for (Entry<String, String> entry : localPropInfo.getAllProperties().entrySet()) {
      final String key = entry.getKey();
      final String value = entry.getValue();

      if (!metadata.containsKey(key)) {
        localScopeProps.addProperty(key, value);
      }
    }

    return localScopeProps;
  }
  /**
   * Get local target property info
   *
   * <p>For control node, properties that can be found in metadata are target properties For extra
   * node, not only exist in metadata, but also ControlNodeOnly==false
   *
   * @param localPropInfo
   * @return
   */
  private PropertyInfoExt getLocalTargetPropInfo(final PropertyInfoExt localPropInfo) {
    Map<String, PropertyMetadata> metadata = PropertiesMetadata.getGlobalMetadata();
    PropertyInfoExt localTargetProps = new PropertyInfoExt();

    for (Entry<String, String> entry : localPropInfo.getAllProperties().entrySet()) {
      final String key = entry.getKey();
      final String value = entry.getValue();

      if (metadata.containsKey(key)) {
        if (coordinator.isControlNode()) {
          localTargetProps.addProperty(key, value);
        } else {
          if (!metadata.get(key).getControlNodeOnly()) {
            localTargetProps.addProperty(key, value);
          }
        }
      }
    }

    return localTargetProps;
  }