/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.hadoop.hdds.scm.net;

/**
 * The interface defines a node in a network topology.
 * A node may be a leave representing a data node or an inner
 * node representing a data center or rack.
 * Each node has a name and its location in the network is
 * decided by a string with syntax similar to a file name.
 * For example, a data node's name is hostname:port# and if it's located at
 * rack "orange" in data center "dog", the string representation of its
 * network location will be /dog/orange.
 */
public interface Node {
  /** @return the string representation of this node's network location path,
   *  exclude itself. In another words, its parent's full network location */
  String getNetworkLocation();

  /**
   * Set this node's network location.
   * @param location it's network location
   */
  void setNetworkLocation(String location);

  /** @return this node's self name in network topology. This should be node's
   * IP or hostname.
   * */
  String getNetworkName();

  /**
   * Set this node's name, can be hostname or Ipaddress.
   * @param name it's network name
   */
  void setNetworkName(String name);

  /** @return this node's full path in network topology. It's the concatenation
   *  of location and name.
   * */
  String getNetworkFullPath();

  /** @return this node's parent */
  InnerNode getParent();

  /**
   * Set this node's parent.
   * @param parent the parent
   */
  void setParent(InnerNode parent);

  /** @return this node's ancestor, generation 0 is itself, generation 1 is
   *  node's parent, and so on.*/
  Node getAncestor(int generation);

  /**
   * @return this node's level in the tree.
   * E.g. the root of a tree returns 1 and root's children return 2
   */
  int getLevel();

  /**
   * Set this node's level in the tree.
   * @param i the level
   */
  void setLevel(int i);

  /**
   * @return this node's cost when network traffic go through it.
   * E.g. the cost of going cross a switch is 1, and cost of going through a
   * datacenter can be 5.
   * Be default the cost of leaf datanode is 0, all other node is 1.
   */
  int getCost();

  /** @return the leaf nodes number under this node. */
  int getNumOfLeaves();

  /**
   * Judge if this node is an ancestor of node <i>n</i>.
   * Ancestor includes itself and parents case.
   *
   * @param n a node
   * @return true if this node is an ancestor of <i>n</i>
   */
  boolean isAncestor(Node n);
}
