def get_daily_plot(day):
    """Return matplotlib plot representing a day's plot."""
    start, end = get_open_close(day)
    desktops = list_desktops(public_only=True)
    profiles = UtilizationProfile.from_hostnames(desktops, start, end).values()
    desks_count = len(desktops)

    now = datetime.now()
    latest = min(end, now)
    minute = timedelta(minutes=1)
    times = [start + i * minute for i in range((latest - start) // minute + 1)]
    if now >= end or now <= start:
        now = None
    sums = []

    for t in times:
        instant15 = t + timedelta(seconds=15)
        instant45 = t + timedelta(seconds=45)
        in_use = sum(
            1 if profile.in_use(instant15) or profile.in_use(instant45) else 0
            for profile in profiles)
        sums.append(in_use)

    # Do a weighted moving average to smooth out the data
    processed = [0] * len(sums)
    for i in range(len(sums)):
        for delta_i, weight in AVERAGE_WEIGHTS:
            m = i if (i + delta_i < 0
                      or i + delta_i >= len(sums)) else i + delta_i
            # Don't use data that hasn't occurred yet
            if now and times[i] <= now and times[m] >= now:
                processed[i] += weight * sums[i]
            elif now and times[i] > now:
                processed[i] = 0
            else:
                processed[i] += weight * sums[m]

    fig = Figure(figsize=(10, 4))
    ax = fig.add_subplot(1, 1, 1)

    ax.grid(True)
    ax.plot_date(times, processed, fmt='b-', color='k', linewidth=1.5)

    # Draw a vertical line, if applicable, showing current time
    if now:
        ax.axvline(now, linewidth=1.5)

    # Draw a horizontal line for total desktops
    ax.axhline(desks_count, ls='dashed')
    ax.annotate('   Total desktops', xy=(start, desks_count + 1))

    ax.xaxis.set_major_formatter(DateFormatter('%-I%P'))
    ax.set_xlim(start, end)

    ax.set_ylim(0, desks_count + 5)
    ax.set_ylabel('Computers in Use')

    ax.set_title(f'Lab Utilization {day:%a %b %d}')
    return fig
Beispiel #2
0
def test_fast_slow_profiles_same():
    start = datetime(2015, 11, 23)
    end = start + timedelta(days=1)

    slow_profiles = {
        host + '.ocf.berkeley.edu': UtilizationProfile.from_hostname(host, start, end)
        for host in list_desktops()
    }
    fast_profiles = UtilizationProfile.from_hostnames(list_desktops(), start, end)

    assert set(slow_profiles.keys()) == set(fast_profiles.keys())

    for host in slow_profiles.keys():
        slow = slow_profiles[host]
        fast = fast_profiles[host]

        assert slow.hostname == fast.hostname
        assert slow.start == fast.start
        assert slow.end == fast.end
        assert slow.sessions == fast.sessions
Beispiel #3
0
def test_fast_slow_profiles_same():
    start = datetime(2015, 11, 23)
    end = start + timedelta(days=1)

    slow_profiles = {
        host + '.ocf.berkeley.edu': UtilizationProfile.from_hostname(host, start, end)
        for host in list_desktops()
    }
    fast_profiles = UtilizationProfile.from_hostnames(list_desktops(), start, end)

    assert set(slow_profiles.keys()) == set(fast_profiles.keys())

    for host in slow_profiles.keys():
        slow = slow_profiles[host]
        fast = fast_profiles[host]

        assert slow.hostname == fast.hostname
        assert slow.start == fast.start
        assert slow.end == fast.end
        assert slow.sessions == fast.sessions
Beispiel #4
0
def get_daily_plot(day):
    """Return matplotlib plot representing a day's plot."""
    start, end = get_open_close(day)
    profiles = UtilizationProfile.from_hostnames(list_desktops(public_only=True), start, end).values()

    now = datetime.now()
    latest = min(end, now)
    minute = timedelta(minutes=1)
    times = [start + i * minute for i in range((latest - start) // minute + 1)]
    if now >= end or now <= start:
        now = None
    sums = []

    for t in times:
        instant15 = t + timedelta(seconds=15)
        instant45 = t + timedelta(seconds=45)
        in_use = sum(1 if profile.in_use(instant15) or profile.in_use(instant45) else 0 for profile in profiles)
        sums.append(in_use)

    # Do a weighted moving average to smooth out the data
    processed = [0] * len(sums)
    for i in range(len(sums)):
        for delta_i, weight in AVERAGE_WEIGHTS:
            m = i if (i + delta_i < 0 or i + delta_i >= len(sums)) else i + delta_i
            # Don't use data that hasn't occurred yet
            if now and times[i] <= now and times[m] >= now:
                processed[i] += weight * sums[i]
            elif now and times[i] > now:
                processed[i] = 0
            else:
                processed[i] += weight * sums[m]

    fig = Figure(figsize=(10, 4))
    ax = fig.add_subplot(1, 1, 1)

    ax.grid(True)
    ax.plot_date(times, processed, fmt='b-', color='k', linewidth=1.5)

    # Draw a vertical line, if applicable, showing current time
    if now:
        ax.axvline(now, linewidth=1.5)

    ax.xaxis.set_major_formatter(DateFormatter('%-I%P'))
    ax.set_xlim(start, end)

    ax.set_ylim(0, len(profiles))
    ax.set_ylabel('Computers in Use')

    ax.set_title('Lab Utilization {:%a %b %d}'.format(day))
    return fig
Beispiel #5
0
def desktop_profiles():
    open_, close = get_open_close(date.today())
    now = datetime.today()

    # If the lab has opened, but hasn't closed yet, only count
    # statistics until the current time. If the lab isn't open
    # yet, then don't count anything, and if it is closed, show
    # statistics from when it was open during the day.
    if now > open_ and now < close:
        end = now
    elif now <= open_:
        end = open_
    else:
        end = close

    return sorted(
        UtilizationProfile.from_hostnames(list_desktops(), open_, end).values(),
        key=attrgetter('hostname'),
    )
Beispiel #6
0
def desktop_profiles() -> List[Any]:
    open_, close = get_open_close(date.today())
    now = datetime.today()

    # If the lab has opened, but hasn't closed yet, only count
    # statistics until the current time. If the lab isn't open
    # yet, then don't count anything, and if it is closed, show
    # statistics from when it was open during the day.
    if now > open_ and now < close:
        end = now
    elif now <= open_:
        end = open_
    else:
        end = close

    return sorted(
        UtilizationProfile.from_hostnames(list_desktops(), open_, end).values(),
        key=attrgetter('hostname'),
    )
Beispiel #7
0
from datetime import datetime
from datetime import timedelta

from ocflib.lab.stats import list_desktops
from ocflib.lab.stats import UtilizationProfile


@contextmanager
def timeit():
    start = time.time()
    yield
    print('Time taken: {}'.format(time.time() - start))


if __name__ == '__main__':
    start = datetime(2015, 11, 23)
    end = start + timedelta(days=1)

    print('Testing naive time to create profiles.')
    with timeit():
        slow_profiles = {
            host + '.ocf.berkeley.edu':
            UtilizationProfile.from_hostname(host, start, end)
            for host in list_desktops()
        }

    print('Testing optimized time to create profiles.')
    with timeit():
        fast_profiles = UtilizationProfile.from_hostnames(
            list_desktops(), start, end)
Beispiel #8
0
import time
from contextlib import contextmanager
from datetime import datetime
from datetime import timedelta

from ocflib.lab.stats import list_desktops
from ocflib.lab.stats import UtilizationProfile


@contextmanager
def timeit():
    start = time.time()
    yield
    print('Time taken: {}'.format(time.time() - start))


if __name__ == '__main__':
    start = datetime(2015, 11, 23)
    end = start + timedelta(days=1)

    print('Testing naive time to create profiles.')
    with timeit():
        slow_profiles = {
            host + '.ocf.berkeley.edu': UtilizationProfile.from_hostname(host, start, end)
            for host in list_desktops()
        }

    print('Testing optimized time to create profiles.')
    with timeit():
        fast_profiles = UtilizationProfile.from_hostnames(list_desktops(), start, end)