def test_dispatch(self):
        service = client.connect(**self.opts.kwargs)
        saved_searches = service.saved_searches

        if 'sdk-test1' in saved_searches:
            saved_searches.delete('sdk-test1')
        self.assertFalse('sdk-test1' in saved_searches)

        search = "search index=sdk-tests * earliest=-1m"
        saved_search = saved_searches.create('sdk-test1', search)
        self.assertEqual('sdk-test1', saved_search.name)
        self.assertTrue('sdk-test1' in saved_searches)

        job = saved_search.dispatch()
        testlib.wait(job, lambda job: bool(int(job['isDone'])))
        job.results().close()
        job.cancel()

        # Dispatch with some additional options
        kwargs = { 'dispatch.buckets': 100 }
        job = saved_search.dispatch(**kwargs)
        testlib.wait(job, lambda job: bool(int(job['isDone'])))
        job.timeline().close()
        job.cancel()

        saved_searches.delete('sdk-test1')
        self.assertFalse('sdk-test1' in saved_searches)
예제 #2
0
    def test_results(self):
        service = client.connect(**self.opts.kwargs)

        jobs = service.jobs

        # Run a new job to get the results, but we also make
        # sure that there is at least one event in the index already
        index = service.indexes['sdk-tests']
        old_event_count = int(index['totalEventCount'])
        if old_event_count == 0:
            index.submit("test event")
            testlib.wait(index, lambda index: index['totalEventCount'] == '1')

        job = jobs.create("search index=sdk-tests | head 1 | stats count")
        testlib.wait(job, lambda job: job['isDone'] == '1')
        self.assertEqual(job['isDone'], '1')

        # Fetch the results
        reader = results.ResultsReader(job.results())

        # The first one should always be RESULTS
        kind, result = reader.next()
        self.assertEqual(results.RESULTS, kind)
        self.assertEqual(int(result["preview"]), 0)

        # The second is always the actual result
        kind, result = reader.next()
        self.assertEqual(results.RESULT, kind)
        self.assertEqual(int(result["count"]), 1)
예제 #3
0
    def test_crud(self):
        service = client.connect(**self.opts.kwargs)

        jobs = service.jobs

        if not service.indexes.contains("sdk-tests"):
            service.indexes.create("sdk-tests")
        service.indexes['sdk-tests'].clean()

        # Make sure we can create a job
        job = jobs.create("search index=sdk-tests")
        self.assertTrue(jobs.contains(job.sid))

        # Make sure we can cancel the job
        job.cancel()
        self.assertFalse(jobs.contains(job.sid))

        # Search for non-existant data
        job = jobs.create("search index=sdk-tests TERM_DOES_NOT_EXIST")
        testlib.wait(job, lambda job: job['isDone'] == '1')
        self.assertEqual(job['isDone'], '1')
        self.assertEqual(job['eventCount'], '0')
        job.finalize()
        
        # Create a new job
        job = jobs.create("search * | head 1 | stats count")
        self.assertTrue(jobs.contains(job.sid))

        # Set various properties on it
        job.disable_preview()
        job.pause()
        job.set_ttl(1000)
        job.set_priority(5)
        job.touch()
        job.refresh()

        # Assert that the properties got set properly
        self.check_properties(job, {
            'isPreviewEnabled': '0',
            'isPaused': '1',
            'ttl': '1000',
            'priority': '5'
        })

        # Set more properties
        job.enable_preview()
        job.unpause()
        job.finalize()
        job.refresh()

        # Assert that they got set properly
        self.check_properties(job, {
            'isPreviewEnabled': '1',
            'isPaused': '0',
            'isFinalized': '1'
        })

        job.cancel()
        self.assertFalse(jobs.contains(job.sid))
예제 #4
0
    def test_crud(self):
        service = client.connect(**self.opts.kwargs)

        if not service.indexes.contains("sdk-tests"):
            service.indexes.create("sdk-tests")
        self.assertTrue(service.indexes.contains("sdk-tests"))

        index = service.indexes['sdk-tests']

        index.disable()
        index.refresh()
        self.assertEqual(index['disabled'], '1')

        index.enable()
        index.refresh()
        self.assertEqual(index['disabled'], '0')
            
        index.clean()
        index.refresh()
        self.assertEqual(index['totalEventCount'], '0')

        cn = index.attach()
        cn.write("Hello World!")
        cn.close()
        testlib.wait(index, lambda index: index['totalEventCount'] == '1')
        self.assertEqual(index['totalEventCount'], '1')

        index.submit("Hello again!!")
        testlib.wait(index, lambda index: index['totalEventCount'] == '2')
        self.assertEqual(index['totalEventCount'], '2')

        # The following test must run on machine where splunkd runs,
        # otherwise a failure is expected
        testpath = path.dirname(path.abspath(__file__))
        index.upload(path.join(testpath, "testfile.txt"))
        testlib.wait(index, lambda index: index['totalEventCount'] == '3')
        self.assertEqual(index['totalEventCount'], '3')

        index.clean()
        index.refresh()
        self.assertEqual(index['totalEventCount'], '0')
예제 #5
0
    def test_analytics(self):
        # We have to add the current path to the PYTHONPATH,
        # otherwise the import doesn't work quite right
        sys.path.append(os.getcwd())
        import analytics

        # Create a tracker
        tracker = analytics.input.AnalyticsTracker(
            "sdk-test", self.opts.kwargs, index = "sdk-test")

        service = client.connect(**self.opts.kwargs)

        # Before we start, we'll clean the index
        index = service.indexes["sdk-test"]
        index.clean()
        
        tracker.track("test_event", distinct_id="abc123", foo="bar", abc="123")
        tracker.track("test_event", distinct_id="123abc", abc="12345")

        # Wait until the events get indexed
        testlib.wait(index, lambda index: index['totalEventCount'] == '2')

        # Now, we create a retriever to retrieve the events
        retriever = analytics.output.AnalyticsRetriever(
            "sdk-test", self.opts.kwargs, index = "sdk-test")    
        
        # Assert applications
        applications = retriever.applications()
        self.assertEquals(len(applications), 1)
        self.assertEquals(applications[0]["name"], "sdk-test")
        self.assertEquals(applications[0]["count"], 2)

        # Assert events
        events = retriever.events()
        self.assertEqual(len(events), 1)
        self.assertEqual(events[0]["name"], "test_event")
        self.assertEqual(events[0]["count"], 2)

        # Assert properties
        expected_properties = {
            "abc": 2,
            "foo": 1
        }
        properties = retriever.properties("test_event")
        self.assertEqual(len(properties), len(expected_properties))
        for prop in properties:
            name = prop["name"]
            count = prop["count"]
            self.assertTrue(name in expected_properties.keys())
            self.assertEqual(count, expected_properties[name])

        # Assert property values
        expected_property_values = {
            "123": 1,
            "12345": 1
        }
        values = retriever.property_values("test_event", "abc")
        self.assertEqual(len(values), len(expected_property_values))
        for value in values:
            name = value["name"]
            count = value["count"]
            self.assertTrue(name in expected_property_values.keys())
            self.assertEqual(count, expected_property_values[name])
            
        # Assert event over time
        over_time = retriever.events_over_time(
            time_range = analytics.output.TimeRange.MONTH)
        self.assertEquals(len(over_time), 1)
        self.assertEquals(len(over_time["test_event"]), 1)
        self.assertEquals(over_time["test_event"][0]["count"], 2)

        # Now that we're done, we'll clean the index 
        index.clean()
예제 #6
0
    def test(self):
        domain = self.environment.IPADOMAIN
        domainip = self.environment.IPADOMAINIP

        self.replace_file("/etc/resolv.conf",
                          "domain %s\nsearch %s\nnameserver %s\n"
                          % (domain, domain, domainip))

        wait(lambda: process.run("nslookup -type=SRV _ldap._tcp.%s" % domain))

        default_user = "******"
        b = self.browser
        b.login_and_go("server", user=default_user, href="/system/host")

        def wait_number_domains(n):
            if n == 0:
                b.wait_text("#system_information_realms_button", "Join Domain")
            else:
                b.wait_text_not("#system_information_realms_button", "Join Domain")
            b.wait_not_attr("#system_information_realms_button", "disabled", "disabled")

        wait_number_domains(0)

        # Join cockpit.lan
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        with b.wait_timeout(120):
            b.set_val(".realms-op-address", domain)
            b.wait_attr(".realms-op-admin", "placeholder", 'e.g. "admin"')
            b.set_val(".realms-op-admin", "admin")
            b.set_val(".realms-op-admin-password", "foobarfoo")
            b.click(".realms-op-apply")
            b.wait_popdown("realms-op")

            # Check that this has worked
            wait_number_domains(1)

        # Leave the domain
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        b.click(".realms-op-apply")
        b.wait_popdown("realms-op")
        wait_number_domains(0)

        # Send a wrong password
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        b.set_val(".realms-op-address", domain)
        b.wait_attr(".realms-op-admin", "placeholder", 'e.g. "admin"')
        b.set_val(".realms-op-admin", "admin")
        b.set_val(".realms-op-admin-password", "foo")
        b.click(".realms-op-apply")
        b.wait_text_not(".realms-op-error", "")
        b.click(".realms-op-cancel")
        b.wait_popdown("realms-op")

        # Try to join a non-existing domain
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        b.set_val(".realms-op-address", "NOPE")
        b.wait_js_cond("$('.realms-op-address-error').attr('title') != ''")
        b.click(".realms-op-cancel")
        b.wait_popdown("realms-op")

        # Cancel a join
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        b.set_val(".realms-op-address", domain)
        b.wait_attr(".realms-op-admin", "placeholder", 'e.g. "admin"')
        b.set_val(".realms-op-admin", "admin")
        b.set_val(".realms-op-admin-password", "foobarfoo")
        b.click(".realms-op-apply")
        b.wait_visible(".realms-op-spinner")
        b.click(".realms-op-cancel")
        b.wait_popdown("realms-op")
예제 #7
0
    def test(self):
        domain = self.environment.IPADOMAIN
        domainip = self.environment.IPADOMAINIP

        self.replace_file(
            "/etc/resolv.conf", "domain %s\nsearch %s\nnameserver %s\n" %
            (domain, domain, domainip))

        # Wait for DNS to work as expected.
        # https://bugzilla.redhat.com/show_bug.cgi?id=1071356#c11
        #
        wait(lambda: process.run("nslookup -type=SRV _ldap._tcp.%s" % domain))

        default_user = "******"
        b = self.browser

        b.login_and_go("/system", user=default_user)

        def wait_number_domains(n):
            if n == 0:
                b.wait_text("#system-info-domain a", "Join Domain")
            else:
                b.wait_text_not("#system-info-domain a", "Join Domain")
            b.wait_not_attr("#system-info-domain a", "disabled", "disabled")

        wait_number_domains(0)

        # Join cockpit.lan
        b.click("#system-info-domain a")
        b.wait_popup("realms-op")
        with b.wait_timeout(120):
            b.set_val(".realms-op-address", domain)
            b.wait_attr(".realms-op-admin", "placeholder", 'e.g. "admin"')
            b.set_val(".realms-op-admin", "admin")
            b.set_val(".realms-op-admin-password", "foobarfoo")
            b.click(".realms-op-apply")
            b.wait_popdown("realms-op")

            # Check that this has worked
            wait_number_domains(1)

        # Leave the domain
        b.click("#system-info-domain a")
        b.wait_popup("realms-op")
        b.click(".realms-op-apply")
        b.wait_popdown("realms-op")
        wait_number_domains(0)

        # Send a wrong password
        b.click("#system-info-domain a")
        b.wait_popup("realms-op")
        b.set_val(".realms-op-address", domain)
        b.wait_attr(".realms-op-admin", "placeholder", 'e.g. "admin"')
        b.set_val(".realms-op-admin", "admin")
        b.set_val(".realms-op-admin-password", "foo")
        b.click(".realms-op-apply")
        b.wait_text_not(".realms-op-error", "")
        b.click(".realms-op-cancel")
        b.wait_popdown("realms-op")

        # Try to join a non-existing domain
        b.click("#system-info-domain a")
        b.wait_popup("realms-op")
        b.set_val(".realms-op-address", "NOPE")
        b.wait_js_cond("$('.realms-op-address-error').attr('title') != ''")
        b.click(".realms-op-cancel")
        b.wait_popdown("realms-op")

        # Cancel a join
        b.click("#system-info-domain a")
        b.wait_popup("realms-op")
        b.set_val(".realms-op-address", domain)
        b.wait_attr(".realms-op-admin", "placeholder", 'e.g. "admin"')
        b.set_val(".realms-op-admin", "admin")
        b.set_val(".realms-op-admin-password", "foobarfoo")
        b.click(".realms-op-apply")
        b.wait_visible(".realms-op-spinner")
        b.click(".realms-op-cancel")
        b.wait_popdown("realms-op")
예제 #8
0
    def test(self):
        domain = self.environment.IPADOMAIN
        domainip = self.environment.IPADOMAINIP

        self.replace_file(
            "/etc/resolv.conf", "domain %s\nsearch %s\nnameserver %s\n" %
            (domain, domain, domainip))

        wait(lambda: process.run("nslookup -type=SRV _ldap._tcp.%s" % domain))

        default_user = "******"
        b = self.browser
        b.login_and_go("server", user=default_user, href="/system/host")

        def wait_number_domains(n):
            if n == 0:
                b.wait_text("#system_information_realms_button", "Join Domain")
            else:
                b.wait_text_not("#system_information_realms_button",
                                "Join Domain")
            b.wait_dbus_prop('com.redhat.Cockpit.Realms', 'Busy', ",")

        wait_number_domains(0)

        # Join cockpit.lan
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        with b.wait_timeout(120):
            b.set_val("#realms-op-address", domain)
            b.wait_attr("#realms-op-admin", "placeholder", 'e.g. "admin"')
            b.set_val("#realms-op-admin", "admin")
            b.set_val("#realms-op-admin-password", "foobarfoo")
            b.click("#realms-op-apply")
            b.wait_popdown("realms-op")

            # Check that this has worked
            wait_number_domains(1)

        # Leave the domain
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        b.click("#realms-op-apply")
        b.wait_popdown("realms-op")
        wait_number_domains(0)

        # Send a wrong password
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        b.set_val("#realms-op-address", domain)
        b.wait_attr("#realms-op-admin", "placeholder", 'e.g. "admin"')
        b.set_val("#realms-op-admin", "admin")
        b.set_val("#realms-op-admin-password", "foo")
        b.click("#realms-op-apply")
        b.wait_text_not("#realms-op-error", "")
        b.click("#realms-op-cancel")
        b.wait_popdown("realms-op")

        # Try to join a non-existing domain
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        b.set_val("#realms-op-address", "NOPE")
        b.wait_js_cond("$('#realms-op-address-error').attr('title') != ''")
        b.click("#realms-op-cancel")
        b.wait_popdown("realms-op")

        # Cancel a join
        b.click("#system_information_realms_button")
        b.wait_popup("realms-op")
        b.set_val("#realms-op-address", domain)
        b.wait_attr("#realms-op-admin", "placeholder", 'e.g. "admin"')
        b.set_val("#realms-op-admin", "admin")
        b.set_val("#realms-op-admin-password", "foobarfoo")
        b.click("#realms-op-apply")
        b.wait_visible("#realms-op-spinner")
        b.click("#realms-op-cancel")
        b.wait_popdown("realms-op")
    def test_crud(self):
        service = client.connect(**self.opts.kwargs)

        searches = service.saved_searches
        fired_alerts = service.fired_alerts

        if 'sdk-tests' not in service.indexes:
            service.indexes.create("sdk-tests")

        # Clean out the test index
        index = service.indexes['sdk-tests']
        index.clean()
        index.refresh()
        self.assertEqual(event_count(index), 0)

        # Delete any leftover test search
        search_name = "sdk-test-search"
        if search_name in searches: searches.delete(search_name)
        self.assertFalse(search_name in searches)

        # Create a saved search that will register an alert for any event
        # submitted to the `sdk-tests` index. Note that the search is not
        # yet scheduled - we wil schedule after doing a little more cleanup.
        query = "index=sdk-tests"
        kwargs = {
            'actions': "rss",
            'alert_type': "always",
            'alert_comparator': "greater than",
            'alert_threshold': "0",
            'alert.severity': "5",
            'alert.suppress': "0",
            'alert.track': "1",
            'dispatch.earliest_time': "rt",
            'dispatch.latest_time': "rt",
            'is_scheduled': "0",
            'realtime_schedule': "1",
            'cron_schedule': "* * * * *"
        }
        search = searches.create(search_name, query, **kwargs)
        self.assertEqual(search.name, search_name)
        self.assertEqual(search.content.is_scheduled, "0")

        # Clear out any search history that may have matched due to reuse of 
        # the saved search name.
        for job in search.history(): job.cancel()
        testlib.wait(search, lambda search: len(search.history()) == 0)
        self.assertEqual(len(search.history()), 0)

        # Now schedule the saved search
        search.update(is_scheduled=1)
        search.refresh()
        self.assertEqual(search.content.is_scheduled, "1")
        self.assertEqual(alert_count(search), 0)

        # Wait for the saved search to run. When it runs we will see a new job
        # show up in the search's history.
        testlib.wait(search, lambda search: len(search.history()) == 1)
        self.assertEqual(len(search.history()), 1)

        # When it first runs the alert count should be zero.
        search.refresh()
        self.assertEqual(alert_count(search), 0)

        # And the fired alerts category should not exist
        self.assertFalse(search_name in fired_alerts)

        # Submit events and verify that they each trigger the expected alert
        for count in xrange(1, 6):
            # Submit an event that the search is expected to match, and wait 
            # for the indexer to process.
            self.assertTrue(event_count(index) <= count)
            index.submit("Hello #%d!!!" % count)
            testlib.wait(index, lambda index: event_count(index) == count)

            # Wait for the saved search to register the triggered alert
            self.assertTrue(alert_count(search) <= count)
            testlib.wait(
                search, 
                lambda search: alert_count(search) == count, 
                timeout=120)
            self.assertEqual(alert_count(search), count)

            # And now .. after all that trouble, verify that we see the alerts!
            self.assertTrue(search_name in fired_alerts)
            alert_group = fired_alerts[search_name]
            self.assertEqual(alert_group.name, search_name)
            self.assertEqual(alert_group.count, count)

        # Cleanup
        searches.delete(search_name)
        self.assertFalse(search_name in searches)
        self.assertFalse(search_name in fired_alerts)