def setup():
    '''interactively edit the setup file. filepath must first be set'''
    checkForSetupFile()

    location = getLocation()
    if location:
        if prompt_bool('\nlocation has been configured as "%s", would you like to change this' % location):
            configLocation()
    else:
        configLocation()

    while True:
        if getAppliances() and not prompt_bool('\nDo you want to add/change/remove/view/check ' + \
                                'an appliance that is to be used when running local tests?'):
            break
        configAppliance()
        while True:
            if not prompt_bool('\nDo you want to add/change/remove/view/check another appliance?'):
                break
            configAppliance()
        break
        
    currentArgs = getArgs()
    if currentArgs:
        ansi.printc('\ncurrently sb test is adding the following args')
        ansi.writec(currentArgs, colors.PARAM_COLOR)
    if prompt_bool('\nsb test can be configured to always add arguments like -s ' '\n' \
                         'I have this configured to add' '\n' \
                         '-s --no-build-first --skip-compiled  --nologcapture' '\n' \
                         'to sb test' '\n' \
                         'for most people this is an unneccessary configuration' '\n'
                         'would you like to configure this'):
        configArgs()
def prompt_bool(
    msg,
    default='n'
):  #textui.prompt.prompt_bool should probably be replaced with this, and used instead
    '''
    Ask user for a yes/no answer.

    @param default If None, don't default and keep asking until either 'y'
           or 'n' is received. Otherwise, use the default value if neither
           'y' or 'n' is recieved
    '''
    while True:
        ansi.writec(msg)
        if default == 'y':
            ansi.writec(' (Y/n) ', colors.PARAM_COLOR)
        if default == 'n':
            ansi.writec(' (y/N) ', colors.PARAM_COLOR)
        else:
            ansi.writec(' (y/n) ', colors.PARAM_COLOR)

        answer = raw_input().strip().lower()

        if answer == 'y':
            return True
        if answer == 'n':
            return False
        if default != None:
            return
def prompt_bool(msg, default='n'): #textui.prompt.prompt_bool should probably be replaced with this, and used instead
    '''
    Ask user for a yes/no answer.

    @param default If None, don't default and keep asking until either 'y'
           or 'n' is received. Otherwise, use the default value if neither
           'y' or 'n' is recieved
    '''
    while True:
        ansi.writec(msg)
        if default == 'y': 
            ansi.writec(' (Y/n) ', colors.PARAM_COLOR)
        if default == 'n':
            ansi.writec(' (y/N) ', colors.PARAM_COLOR)
        else:
            ansi.writec(' (y/n) ', colors.PARAM_COLOR)
        
        answer = raw_input().strip().lower()

        if answer == 'y': 
            return True
        if answer == 'n': 
            return False
        if default != None: 
            return
def setup():
    '''interactively edit the setup file. filepath must first be set'''
    checkForSetupFile()

    location = getLocation()
    if location:
        if prompt_bool(
                '\nlocation has been configured as "%s", would you like to change this'
                % location):
            configLocation()
    else:
        configLocation()

    while True:
        if getAppliances() and not prompt_bool('\nDo you want to add/change/remove/view/check ' + \
                                'an appliance that is to be used when running local tests?'):
            break
        configAppliance()
        while True:
            if not prompt_bool(
                    '\nDo you want to add/change/remove/view/check another appliance?'
            ):
                break
            configAppliance()
        break

    currentArgs = getArgs()
    if currentArgs:
        ansi.printc('\ncurrently sb test is adding the following args')
        ansi.writec(currentArgs, colors.PARAM_COLOR)
    if prompt_bool('\nsb test can be configured to always add arguments like -s ' '\n' \
                         'I have this configured to add' '\n' \
                         '-s --no-build-first --skip-compiled  --nologcapture' '\n' \
                         'to sb test' '\n' \
                         'for most people this is an unneccessary configuration' '\n'
                         'would you like to configure this'):
        configArgs()
def configLocation():
    '''interactively configure a location for local tests'''
    while True:
        ansi.writec('\nwhere are you located(')
        ansi.writec('ps-orem, DSR, or other', colors.PARAM_COLOR)
        ansi.writec(') this is for tests like the NetApp connnector tests that require a local machine: ')

        response = raw_input().lower().strip()
        if response == 'ps-orem' or response == 'orem':
            setLocation('ps-orem')  
            break
        if response == 'dsr':
            setLocation('dsr')      
            break
        if response == 'other':
            setLocation('other')       
            break   
        ansi.eprintc('that location does not yet exist', colors.WARNING_COLOR)
def configLocation():
    '''interactively configure a location for local tests'''
    while True:
        ansi.writec('\nwhere are you located(')
        ansi.writec('ps-orem, DSR, or other', colors.PARAM_COLOR)
        ansi.writec(
            ') this is for tests like the NetApp connnector tests that require a local machine: '
        )

        response = raw_input().lower().strip()
        if response == 'ps-orem' or response == 'orem':
            setLocation('ps-orem')
            break
        if response == 'dsr':
            setLocation('dsr')
            break
        if response == 'other':
            setLocation('other')
            break
        ansi.eprintc('that location does not yet exist', colors.WARNING_COLOR)
def configAppliance():
    '''interactively configure an appliance'''

    appName = prompt("\nEnter the name of an existing/new appliance: ",
                     default=None)
    assert appName

    oldHost = oldUser = oldPasswd = None

    if appName in getAppliances():
        oldHost, oldUser, oldPasswd = getAppInfo(appName)

        ansi.printc('\nwhat do you want to do with the appliance %s' % appName)
        ansi.writec('type ')
        ansi.writec('c', colors.PARAM_COLOR)
        ansi.printc(' to change the appliance configurations')
        ansi.writec('type ')
        ansi.writec('r', colors.PARAM_COLOR)
        ansi.printc(' to remove the appliance from the setup file')
        ansi.writec('type ')
        ansi.writec('v', colors.PARAM_COLOR)
        ansi.printc(' to view info about the appliance\'s configuration')
        ansi.writec('type ')
        ansi.writec('check', colors.PARAM_COLOR)
        ansi.printc(' to check the credentials of the appliance')
        response = prompt('\n', choices='options: c, r, v, check', default='v')

        if response == 'c':
            print 'Changing an appliance isn\'t working right now \n the setup file must be manually changed'
            pass
        elif response == 'v':
            displayApplianceInfo(appName)
            return
        elif response == 'r':
            delAppliance(appName)
            return
        elif response == 'check':
            checkCredentials(oldHost, oldUser, oldPasswd)
            return
        else:
            ansi.eprintc('not a valid option', colors.ERROR_COLOR)
            return

    host = prompt('\nwhat is the ip address for "%s"' % appName,
                  default=oldHost)
    name = prompt('\nwhat is the username for the appliance "%s"' % appName,
                  default=oldUser)
    passwd = prompt('\nwhat is the password for "%s"' % appName,
                    default=oldPasswd)

    if prompt_bool(
            '\nWould you like to check the entered credentials for "%s"? (%s must be running):'
            % (appName, appName)):
        if not checkCredentials(host, name, passwd):
            ansi.printc('failed to set up %s' % appName, colors.WARNING_COLOR)
            return

    print '\n%s successfully configured. You can now use the appliance %s ' \
          'to run tests by using the command' % (appName, appName)
    ansi.printc('sb test --psa %s\n' % appName, colors.TITLE_COLOR)

    setAppliance(appName, host, name, passwd)
    return
def configAppliance():
    '''interactively configure an appliance'''

    appName = prompt("\nEnter the name of an existing/new appliance: ", default=None)
    assert appName

    oldHost = oldUser = oldPasswd = None
    
    if appName in getAppliances():
        oldHost, oldUser, oldPasswd = getAppInfo(appName)

        ansi.printc('\nwhat do you want to do with the appliance %s' % appName)
        ansi.writec('type '); ansi.writec('c', colors.PARAM_COLOR);     ansi.printc(' to change the appliance configurations')
        ansi.writec('type '); ansi.writec('r', colors.PARAM_COLOR);     ansi.printc(' to remove the appliance from the setup file')
        ansi.writec('type '); ansi.writec('v', colors.PARAM_COLOR);     ansi.printc(' to view info about the appliance\'s configuration')
        ansi.writec('type '); ansi.writec('check', colors.PARAM_COLOR); ansi.printc(' to check the credentials of the appliance')
        response = prompt('\n', choices='options: c, r, v, check', default='v')
        
        if response == 'c':
            print 'Changing an appliance isn\'t working right now \n the setup file must be manually changed'
            pass
        elif response == 'v':
            displayApplianceInfo(appName)
            return
        elif response == 'r':
            delAppliance(appName)
            return
        elif response == 'check':
            checkCredentials(oldHost, oldUser, oldPasswd)
            return
        else:
            ansi.eprintc('not a valid option', colors.ERROR_COLOR)
            return

    host =   prompt('\nwhat is the ip address for "%s"'             % appName, default=oldHost)
    name =   prompt('\nwhat is the username for the appliance "%s"' % appName, default=oldUser)
    passwd = prompt('\nwhat is the password for "%s"'               % appName, default=oldPasswd)

    if prompt_bool('\nWould you like to check the entered credentials for "%s"? (%s must be running):' % (appName, appName)):
        if not checkCredentials(host, name, passwd):
            ansi.printc('failed to set up %s' % appName, colors.WARNING_COLOR)
            return
            
    print '\n%s successfully configured. You can now use the appliance %s ' \
          'to run tests by using the command' % (appName, appName)
    ansi.printc('sb test --psa %s\n' % appName, colors.TITLE_COLOR)

    setAppliance(appName, host, name, passwd)
    return