Merge ~newell-jensen/maas:lp1795691 into maas:master

Proposed by Newell Jensen
Status: Merged
Approved by: Newell Jensen
Approved revision: 5053dc08be8ff0ee9aa575fcf1a9fdc589fbe2a6
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~newell-jensen/maas:lp1795691
Merge into: maas:master
Diff against target: 145 lines (+44/-12)
5 files modified
src/maasserver/node_action.py (+7/-4)
src/maasserver/websockets/protocol.py (+4/-0)
src/maasserver/websockets/tests/test_protocol.py (+6/-0)
src/maasserver/websockets/tests/test_websockets.py (+23/-8)
src/maasserver/websockets/websockets.py (+4/-0)
Reviewer Review Type Date Requested Status
Andres Rodriguez (community) Approve
Blake Rouse (community) Needs Information
Review via email: mp+355997@code.launchpad.net

Commit message

LP: #1795691 -- Add 'SERVER_NAME' and 'SERVER_PORT' to the websocket protocol request so build_absolute_uri can work properly when retrieving the curtin configuration.

To post a comment you must log in.
Revision history for this message
Andres Rodriguez (andreserl) wrote :

question inline.

review: Needs Information
Revision history for this message
Newell Jensen (newell-jensen) :
Revision history for this message
Blake Rouse (blake-rouse) :
review: Needs Information
Revision history for this message
Newell Jensen (newell-jensen) :
~newell-jensen/maas:lp1795691 updated
f105cc1... by Newell Jensen

Use the host's IP address and port for creating the URI needed by the curtin configuration.

Revision history for this message
Andres Rodriguez (andreserl) :
review: Needs Fixing
Revision history for this message
Andres Rodriguez (andreserl) wrote :

please address comment inline before landing!

review: Approve
~newell-jensen/maas:lp1795691 updated
5053dc0... by Newell Jensen

Update comment about why we are keeping the request creation in the Deploy node action.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/node_action.py b/src/maasserver/node_action.py
2index e5c77ce..e30ab66 100644
3--- a/src/maasserver/node_action.py
4+++ b/src/maasserver/node_action.py
5@@ -484,10 +484,13 @@ class Deploy(NodeAction):
6
7 request = self.request
8 if request is None:
9- # Being called from the websocket, just to ensure that the curtin
10- # configuration is valid. The request object does not need to be
11- # an actual request. 'SERVER_NAME' and 'SERVER_PORT' are required
12- # so `build_absolure_uri` can create an actual absolute URI.
13+ # `compile_node_actions` is the path by which the node
14+ # actions are instantiated. There are other places within the
15+ # code that call compile_node_actions without a request object.
16+ # In this event, and for future uses of these node actions without
17+ # a request being passed in, we need to create one here.
18+ # 'SERVER_NAME' and 'SERVER_PORT' are required so
19+ # `build_absolure_uri` can create an actual absolute URI.
20 request = HttpRequest()
21 request.META['SERVER_NAME'] = 'localhost'
22 request.META['SERVER_PORT'] = 5248
23diff --git a/src/maasserver/websockets/protocol.py b/src/maasserver/websockets/protocol.py
24index b119bb5..98a8033 100644
25--- a/src/maasserver/websockets/protocol.py
26+++ b/src/maasserver/websockets/protocol.py
27@@ -127,6 +127,10 @@ class WebSocketProtocol(Protocol):
28 self.request.META['HTTP_USER_AGENT'] = (
29 self.transport.user_agent)
30 self.request.META['REMOTE_ADDR'] = self.transport.ip_address
31+ self.request.META['SERVER_NAME'] = (
32+ self.transport.host.split(':')[0])
33+ self.request.META['SERVER_PORT'] = (
34+ self.transport.host.split(':')[1])
35
36 d.addCallback(authenticated)
37
38diff --git a/src/maasserver/websockets/tests/test_protocol.py b/src/maasserver/websockets/tests/test_protocol.py
39index f1dc8b5..312ebef 100644
40--- a/src/maasserver/websockets/tests/test_protocol.py
41+++ b/src/maasserver/websockets/tests/test_protocol.py
42@@ -110,6 +110,12 @@ class TestWebSocketProtocol(MAASTransactionServerTestCase):
43 self.assertEquals(
44 protocol.request.META['REMOTE_ADDR'],
45 protocol.transport.ip_address)
46+ self.assertEquals(
47+ protocol.request.META['SERVER_NAME'],
48+ protocol.transport.host.split(':')[0])
49+ self.assertEquals(
50+ protocol.request.META['SERVER_PORT'],
51+ protocol.transport.host.split(':')[1])
52
53 def test_connectionMade_sets_user_and_processes_messages(self):
54 protocol, factory = self.make_protocol(patch_authenticate=False)
55diff --git a/src/maasserver/websockets/tests/test_websockets.py b/src/maasserver/websockets/tests/test_websockets.py
56index 37a47e0..3532381 100644
57--- a/src/maasserver/websockets/tests/test_websockets.py
58+++ b/src/maasserver/websockets/tests/test_websockets.py
59@@ -596,7 +596,10 @@ class WebSocketsResourceTest(MAASTestCase):
60 protocol provided by the user factory.
61 """
62 request = DummyRequest(b"/")
63- request.requestHeaders = Headers({b"user-agent": [b"user-agent"]})
64+ request.requestHeaders = Headers({
65+ b"user-agent": [b"user-agent"],
66+ b"host": [b"host"],
67+ })
68 transport = StringTransportWithDisconnection()
69 transport.protocol = Protocol()
70 request.transport = transport
71@@ -636,9 +639,11 @@ class WebSocketsResourceTest(MAASTestCase):
72 self.resource = WebSocketsResource(lookupProtocol)
73
74 request = DummyRequest(b"/")
75- request.requestHeaders = Headers(
76- {b"sec-websocket-protocol": [b"foo", b"bar"],
77- b"user-agent": [b"user-agent"]})
78+ request.requestHeaders = Headers({
79+ b"sec-websocket-protocol": [b"foo", b"bar"],
80+ b"user-agent": [b"user-agent"],
81+ b"host": [b"host"],
82+ })
83 transport = StringTransportWithDisconnection()
84 transport.protocol = Protocol()
85 request.transport = transport
86@@ -761,7 +766,10 @@ class WebSocketsResourceTest(MAASTestCase):
87 L{WebSocketsResource} returns a failed request with a C{502} code.
88 """
89 request = DummyRequest(b"/")
90- request.requestHeaders = Headers({b"user-agent": [b"user-agent"]})
91+ request.requestHeaders = Headers({
92+ b"user-agent": [b"user-agent"],
93+ b"host": [b"host"],
94+ })
95 request.transport = StringTransportWithDisconnection()
96 self.echoProtocol = None
97 self.update_headers(request, headers={
98@@ -783,7 +791,10 @@ class WebSocketsResourceTest(MAASTestCase):
99 the protocol of the C{TLSMemoryBIOProtocol} instance.
100 """
101 request = DummyRequest(b"/")
102- request.requestHeaders = Headers({b"user-agent": [b"user-agent"]})
103+ request.requestHeaders = Headers({
104+ b"user-agent": [b"user-agent"],
105+ b"host": [b"host"],
106+ })
107 transport = StringTransportWithDisconnection()
108 secureProtocol = TLSMemoryBIOProtocol(Factory(), Protocol())
109 transport.protocol = secureProtocol
110@@ -825,7 +836,8 @@ class WebSocketsResourceTest(MAASTestCase):
111 b"sec-websocket-key": b"secure",
112 b"sec-websocket-version": b"13",
113 b"user-agent": b"user-agent",
114- b"client": b"client"}
115+ b"client": b"client",
116+ b"host": b"host"}
117 for key, value in headers.items():
118 request.requestHeaders.setRawHeaders(key, [value])
119 request.method = b"GET"
120@@ -858,7 +870,10 @@ class WebSocketsResourceTest(MAASTestCase):
121 self.resource = WebSocketsResource(lookupProtocol)
122
123 request = DummyRequest(b"/")
124- request.requestHeaders = Headers({b"user-agent": [b"user-agent"]})
125+ request.requestHeaders = Headers({
126+ b"user-agent": [b"user-agent"],
127+ b"host": [b"host"],
128+ })
129 transport = StringTransportWithDisconnection()
130 transport.protocol = Protocol()
131 request.transport = transport
132diff --git a/src/maasserver/websockets/websockets.py b/src/maasserver/websockets/websockets.py
133index 4400d60..5cfc28d 100644
134--- a/src/maasserver/websockets/websockets.py
135+++ b/src/maasserver/websockets/websockets.py
136@@ -720,6 +720,10 @@ class WebSocketsResource(object):
137 # the IP address of the client.
138 transport.ip_address = request.getClientIP()
139
140+ # Set the host.
141+ transport.host = request.requestHeaders.getRawHeaders(
142+ 'host')[0]
143+
144 if not isinstance(protocol, WebSocketsProtocol):
145 protocol = WebSocketsProtocolWrapper(protocol)
146

Subscribers

People subscribed via source and target branches