def test_config_add_interactive(self):
        """
        verify that you can add a user interactively using `jut config add`

        """

        with temp_jut_tools_home():
            configuration = config.get_default()
            app_url = configuration["app_url"]

            # -s because getpass reads from the tty and screws up automated testing
            process = jut("config", "add", "-a", app_url, "-s")

            process.expect_output("Username: "******"jut-tools-user01\n")
            process.expect_output("Password: "******"bigdata\n")
            process.expect_status(0)

            # check the `jut config list` shows the right output
            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, "jut-tools-user01", app_url, default=True))
            process.expect_eof()
    def test_config_rm_non_default_non_interactive(self):
        """
        verify you can non interactively remove a non default configuration

        """

        with temp_jut_tools_home():
            jut_user = os.environ.get("JUT_USER")
            jut_pass = os.environ.get("JUT_PASS")
            configuration = config.get_default()
            app_url = configuration["app_url"]

            process = jut("config", "add", "-u", jut_user, "-p", jut_pass, "-a", app_url)
            process.expect_status(0)

            process = jut("config", "add", "-u", "jut-tools-user01", "-p", "bigdata", "-a", app_url)
            process.expect_status(0)

            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, jut_user, app_url, default=True))
            process.expect_output(confline(2, "jut-tools-user01", app_url, default=False))

            process = jut("config", "rm", "-u", "jut-tools-user01", "-a", app_url)
            process.expect_status(0)

            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, jut_user, app_url, default=True))
            process.expect_eof()
    def test_negative_config_list(self):
        """
        when calling `jut config list` if you haven't configured yet we
        should fail correctly and print the appropriate message

        """
        with temp_jut_tools_home():
            process = jut("config", "list")
            process.expect_error(NO_CONFIG_MESSAGE)
            process.expect_status(255)
            process.expect_eof()
    def test_jut_jobs_connect_on_persistent_job(self):
        """
        verify we can reconnect to a persistent job

        """
        with temp_jut_tools_home():
            configuration = config.get_default()
            app_url = configuration['app_url']

            process = jut('config',
                          'add',
                          '-u', 'jut-tools-user03',
                          '-p', 'bigdata',
                          '-a', app_url,
                          '-d')
            process.expect_status(0)

            process = jut('run',
                          '--name', 'Persistent Job #3',
                          '-p',
                          'emit -limit 10000 '
                          '| put source_type="event", foo="bar"'
                          '| (write -space "%s"; keep foo | pass)' %
                          JutJobsTests.test_space)

            process.expect_status(0)
            job_id = process.read_output().strip()

            process = jut('jobs',
                          'connect',
                          job_id,
                          '-f', 'text')

            # verify that we output 'bar' a few times
            process.expect_output('bar\n')
            process.expect_output('bar\n')
            process.expect_output('bar\n')
            process.expect_output('bar\n')
            process.expect_output('bar\n')

            process.send_signal(signal.SIGTERM)
            process.expect_status(-signal.SIGTERM)

            process = jut('jobs',
                          'kill',
                          job_id,
                          '-y')
            process.expect_status(0)
            process.expect_eof()

            process = jut('jobs', 'list')
            process.expect_status(0)
            process.expect_error('No running jobs')
    def test_config_rm_default_interactive(self):
        """
        verify you can interactively remove a default configuration and
        be prompted to pick a new default

        """

        with temp_jut_tools_home():
            jut_user = os.environ.get("JUT_USER")
            jut_pass = os.environ.get("JUT_PASS")
            configuration = config.get_default()
            app_url = configuration["app_url"]

            process = jut("config", "add", "-u", jut_user, "-p", jut_pass, "-a", app_url)
            process.expect_status(0)

            process = jut("config", "add", "-u", "jut-tools-user01", "-p", "bigdata", "-a", app_url)
            process.expect_status(0)

            process = jut("config", "add", "-u", "jut-tools-user02", "-p", "bigdata", "-a", app_url)
            process.expect_status(0)

            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, jut_user, app_url, default=True))
            process.expect_output(confline(2, "jut-tools-user01", app_url, default=False))
            process.expect_output(confline(3, "jut-tools-user02", app_url, default=False))

            process = jut("config", "rm")
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, jut_user, app_url, default=True))
            process.expect_output(confline(2, "jut-tools-user01", app_url, default=False))
            process.expect_output(confline(3, "jut-tools-user02", app_url, default=False))
            process.expect_output("Which configuration to remove: ")
            process.send("1\n")
            process.expect_output("Pick a default configuration from the list below\n")
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, "jut-tools-user01", app_url, default=False))
            process.expect_output(confline(2, "jut-tools-user02", app_url, default=False))
            process.expect_output("Set default configuration to: ")
            process.send("2\n")
            process.expect_status(0)

            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, "jut-tools-user01", app_url, default=False))
            process.expect_output(confline(2, "jut-tools-user02", app_url, default=True))
            process.expect_eof()
    def test_jut_kill_on_persistent_job(self):
        """
        verify that a persistent job can be killed using `jut jobs kill`

        """
        with temp_jut_tools_home():
            configuration = config.get_default()
            app_url = configuration['app_url']

            process = jut('config',
                          'add',
                          '-u', 'jut-tools-user02',
                          '-p', 'bigdata',
                          '-a', app_url,
                          '-d')
            process.expect_status(0)

            process = jut('run',
                          '--name', 'Persistent Job #1',
                          '-p',
                          'emit -limit 10000 '
                          '| put source_type="event" '
                          '| write -space "%s"' % JutJobsTests.test_space)
            process.expect_status(0)
            job_id = process.read_output().strip()

            process = jut('jobs',
                          'list',
                          '-f', 'text')

            process.expect_status(0)
            output = process.read_output()
            lines = output.split('\n')
            re.match(r'Job ID\w+Juttle Name\w+Owner\w+Start Date\w+Persistent', lines[0])
            re.match(r'%s\w+Persistent Job #1\w+jut-tools-user02.*YES' % job_id, lines[1])

            process = jut('jobs',
                          'kill',
                          job_id,
                          '-y')
            process.expect_status(0)
            process.expect_eof()

            process = jut('jobs', 'list')
            process.expect_status(0)
            process.expect_error('No running jobs')
    def test_config_add_non_interactive(self):
        """
        add a few tests accounts to the default configuration and then add
        those configurations to the current jut tools config

        """
        with temp_jut_tools_home():
            configuration = config.get_default()
            app_url = configuration["app_url"]

            process = jut("config", "add", "-u", "jut-tools-user01", "-p", "bigdata", "-a", app_url)
            process.expect_status(0)

            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, "jut-tools-user01", app_url, default=True))
            process.expect_eof()
    def test_config_defaults_interactive(self):
        """
        verify you can interactively modify the config default

        """

        with temp_jut_tools_home() as home_dir:
            jut_user = os.environ.get("JUT_USER")
            jut_pass = os.environ.get("JUT_PASS")
            configuration = config.get_default()
            app_url = configuration["app_url"]

            process = jut("config", "add", "-u", jut_user, "-p", jut_pass, "-a", app_url)
            process.expect_status(0)

            process = jut("config", "add", "-u", "jut-tools-user01", "-p", "bigdata", "-a", app_url)
            process.expect_status(0)

            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, jut_user, app_url, default=True))
            process.expect_output(confline(2, "jut-tools-user01", app_url, default=False))

            process = jut("config", "defaults")

            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, jut_user, app_url, default=True))
            process.expect_output(confline(2, "jut-tools-user01", app_url, default=False))
            process.expect_output("Set default configuration to: ")
            process.send("2\n")
            process.expect_output("Configuration updated at %s\n" % home_dir)
            process.expect_status(0)
            process.expect_eof()

            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, jut_user, app_url, default=False))
            process.expect_output(confline(2, "jut-tools-user01", app_url, default=True))
            process.expect_eof()
    def test_jut_jobs_with_running_jobs(self):
        """
        verify that a simple long running program can be displayed correctly
        when running `jut jobs list`

        """
        with temp_jut_tools_home():
            configuration = config.get_default()
            app_url = configuration['app_url']

            process = jut('config',
                          'add',
                          '-u', 'jut-tools-user01',
                          '-p', 'bigdata',
                          '-a', app_url,
                          '-d')

            process.expect_status(0)

            process = jut('run',
                          '--name', 'Persistent Job #1',
                          '-p',
                          'emit -limit 100 '
                          '| put source_type="event" '
                          '| write -space "%s"' % JutJobsTests.test_space)

            process.expect_status(0)
            job_id = process.read_output()

            process = jut('jobs',
                          'list',
                          '-f', 'text')

            process.expect_status(0)
            output = process.read_output()
            lines = output.split('\n')
            re.match(r'Job ID\w+Juttle Name\w+Owner\w+Start Date\w+Persistent', lines[0])
            re.match(r'%s\w+Persistent Job #1\w+jut-tools-user01.*YES' % job_id, lines[1])
    def test_config_defaults_non_interactive(self):
        """
        see that you can easily change the default configuration in use
        and that it switches back once you delete the default configuration

        """

        with temp_jut_tools_home() as home_dir:
            jut_user = os.environ.get("JUT_USER")
            jut_pass = os.environ.get("JUT_PASS")
            configuration = config.get_default()
            app_url = configuration["app_url"]

            process = jut("config", "add", "-u", jut_user, "-p", jut_pass, "-a", app_url)
            process.expect_status(0)

            process = jut("config", "add", "-u", "jut-tools-user01", "-p", "bigdata", "-a", app_url)
            process.expect_status(0)

            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, jut_user, app_url, default=True))
            process.expect_output(confline(2, "jut-tools-user01", app_url, default=False))
            process.expect_eof()

            process = jut("config", "defaults", "-u", "jut-tools-user01", "-a", app_url)
            process.expect_status(0)
            process.expect_output("Configuration updated at %s\n" % home_dir)
            process.expect_eof()

            process = jut("config", "list")
            process.expect_status(0)
            process.expect_output("Available jut configurations:\n")
            process.expect_output(confline(1, jut_user, app_url, default=False))
            process.expect_output(confline(2, "jut-tools-user01", app_url, default=True))
            process.expect_eof()