17
17
from base64 import b64encode
18
from datetime import (
25
21
from django.conf import settings
26
22
from django.core.urlresolvers import reverse
23
from django.db import connection
27
24
from maasserver.enum import NODE_STATUS
28
25
from maasserver.testing import reload_object
29
26
from maasserver.testing.api import APITestCase
36
33
class TestCommissioningTimeout(MAASServerTestCase):
37
34
"""Testing of commissioning timeout API."""
36
def age_node(self, node, minutes, cursor=None):
37
"""Set back the update/creation timestamps on `node` by `minutes`."""
39
cursor = connection.cursor()
41
UPDATE maasserver_node
43
created = created - interval '%f minutes',
44
updated = updated - interval '%f minutes'
46
""" % (minutes, minutes, node.id))
39
48
def test_check_with_no_action(self):
40
49
self.client_log_in()
41
50
node = factory.make_node(status=NODE_STATUS.READY)
51
self.age_node(node, settings.COMMISSIONING_TIMEOUT + 100)
42
52
response = self.client.post(
43
53
reverse('nodes_handler'), {'op': 'check_commissioning'})
44
54
# Anything that's not commissioning should be ignored.
50
60
def test_check_with_commissioning_but_not_expired_node(self):
51
61
self.client_log_in()
52
node = factory.make_node(
53
status=NODE_STATUS.COMMISSIONING)
62
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
63
self.age_node(node, settings.COMMISSIONING_TIMEOUT - 1)
54
64
response = self.client.post(
55
65
reverse('nodes_handler'), {'op': 'check_commissioning'})
56
66
node = reload_object(node)
61
71
def test_check_with_commissioning_and_expired_node(self):
62
72
self.client_log_in()
63
# Have an interval 1 second longer than the timeout.
64
interval = timedelta(seconds=1, minutes=settings.COMMISSIONING_TIMEOUT)
65
updated_at = datetime.now() - interval
66
node = factory.make_node(
67
status=NODE_STATUS.COMMISSIONING, created=datetime.now(),
73
node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
74
self.age_node(node, settings.COMMISSIONING_TIMEOUT + 1)
70
76
response = self.client.post(
71
77
reverse('nodes_handler'), {'op': 'check_commissioning'})
82
88
for response_node in json.loads(response.content)],
91
def test_check_ignores_timezone_skew_between_python_and_database(self):
92
cursor = connection.cursor()
93
# Set time zone, for the duration of the ongoing transaction.
94
cursor.execute("SET LOCAL TIME ZONE +13")
96
late_node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
98
late_node, settings.COMMISSIONING_TIMEOUT + 1, cursor=cursor)
99
timely_node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
101
timely_node, settings.COMMISSIONING_TIMEOUT - 1, cursor=cursor)
103
response = self.client.post(
104
reverse('nodes_handler'), {'op': 'check_commissioning'})
106
(httplib.OK, [late_node.system_id]),
108
response.status_code,
110
response_node['system_id']
111
for response_node in json.loads(response.content)
115
NODE_STATUS.FAILED_TESTS,
116
reload_object(late_node).status)
118
NODE_STATUS.COMMISSIONING,
119
reload_object(timely_node).status)
86
122
class AdminCommissioningScriptsAPITest(MAASServerTestCase):
87
123
"""Tests for `CommissioningScriptsHandler`."""