#! /usr/bin/python3 -s
#
# Copyright (c) 2013-2019 - Adjacent Link LLC, Bridgewater, New Jersey
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in
#   the documentation and/or other materials provided with the
#   distribution.
# * Neither the name of Adjacent Link LLC nor the names of its
#   contributors may be used to endorse or promote products derived
#   from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#

from __future__ import absolute_import, division, print_function

import os.path
import sys
from etce.field import Field

def main():
    usagestr = '''
List the nodes in the ETCE field specified by HOSTFILE.
An ETCE field consists of a tree of IP resolvable hostnames
up to 2 levels deep.

Roots are interpreted to be nodes with an independent file
system; during tests, configuration is pushed to each root node.
Leaf nodes run applications during tests. A node may be both
a root and leaf node.

Example:

  server1 {
    node-001
    node-002
  }

  server2
  node-003

  server3 {
    server3
    node-004
  }

In this case there are 4 roots
{ server1, server2 and node-003, server3 } and 6 leafs
{ node-001, node-002, server2, node-003, server3, node-004 }.
'''

    import argparse

    parser = argparse.ArgumentParser( \
                prog='etce-list-hosts',
                description=usagestr,
                formatter_class=argparse.RawDescriptionHelpFormatter)

    parser.add_argument('--position',
                        default='all',
                        help='''List the nodes at the specified tree,
                        position, one of { leaves, roots, all }.
                        Default: leaves.''')
    parser.add_argument('hostfile',
                        metavar='HOSTFILE',
                        help='''The ETCE Host file containing the
                        node names from which the remote source
                        directories are collected.''')

    args = parser.parse_args()

    if not os.path.isfile(args.hostfile):
        print('HOSTFILE "%s" does not exist. Quitting.' % args.hostfile, file=sys.stderr)
        exit(1)

    f = Field(args.hostfile)

    if args.position.lower() == 'all':
        for node in f.allnodes():
            print(node)
    elif args.position.lower() == 'roots':
        for node in f.roots():
            print(node)
    elif args.position.lower() == 'leaves':
        for node in f.leaves():
            print(node)
    else:
        print('Unknown position: %s' % args.position)
        exit(1)


if __name__=='__main__':
    main()
