root / docs / design / cyclades-networking.rst @ fc627daa
History | View | Annotate | Download (14.1 kB)
1 |
=================== |
---|---|
2 |
Cyclades Networking |
3 |
=================== |
4 |
|
5 |
Networks |
6 |
======== |
7 |
|
8 |
A Cyclades network is a virtual network that can be, depending on it's Network |
9 |
Flavor, either an isolated Layer-2 broadcast domain or an Layer-3 network. |
10 |
Networks can either be private or public. Private networks are reserved for the |
11 |
user who created it, while public networks are created by the administrator and |
12 |
are visible to all users. Also, networks can be marked with the |
13 |
`--router:external` attribute to indicate that are external networks (public |
14 |
interner) |
15 |
|
16 |
Currently there are four available Networks Flavors: |
17 |
|
18 |
* IP_ONLY: A Layer-3 network where host routes traffic to the external network. |
19 |
* PHYSICAL_VLAN: A Layer-2 network where a physical VLAN is assigned to the |
20 |
network. |
21 |
* MAC_FILTERED: A Layer-2 network. All networks of this type share the same |
22 |
physical VLAN, but isolation is achieved by filtering rules based on a |
23 |
unique MAC prefix that is assigned to each network. |
24 |
|
25 |
The administrator can limit which networks can be created via API with the |
26 |
`API_ENABLED_NETOWRK_FLAVORS` setting. |
27 |
|
28 |
The attributes for network objects are the following: |
29 |
|
30 |
* id: A string represeting the UUID for the network. |
31 |
* name: A human readable name |
32 |
* status: String represetng the state of the network. Possible values for the |
33 |
state include: ACTIVE, DOWN, BUILD, ERROR |
34 |
* subnets: List of subnet UUIDs that are associated with this network |
35 |
* public: Whether network is visible to other users or not. |
36 |
* user_id/tenant_id: The UUID of the owner of the network. |
37 |
* admin_state_up: Boolean value indicating the administrative state of the |
38 |
network. If 'down' the network does not forward packets. |
39 |
|
40 |
Note: The 'admin_state_up' value is used only for compatibility with Neutron |
41 |
API. It will be read-only, and will always be True. |
42 |
|
43 |
Create a new network |
44 |
^^^^^^^^^^^^^^^^^^^^ |
45 |
|
46 |
Method: POST |
47 |
|
48 |
URI: /networks |
49 |
|
50 |
The body of the request must contain the 'type' of the network. Also it can |
51 |
a 'name' attribute. |
52 |
|
53 |
List Networks |
54 |
^^^^^^^^^^^^^ |
55 |
|
56 |
Method: GET |
57 |
|
58 |
URI: /networks |
59 |
|
60 |
Get details about a network |
61 |
^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
62 |
|
63 |
METHOD: GET |
64 |
|
65 |
URI: /networks/$(network_id) |
66 |
|
67 |
Example response: |
68 |
|
69 |
+-----------------+-----------------------------------+ |
70 |
| Field | Value | |
71 |
+=================+===================================+ |
72 |
| admin_state_up | True | |
73 |
+-----------------+-----------------------------------+ |
74 |
| id | 42 | |
75 |
+-----------------+-----------------------------------+ |
76 |
| name | Test_network | |
77 |
+-----------------+-----------------------------------+ |
78 |
| network_type | MAC_FILTERED | |
79 |
+-----------------+-----------------------------------+ |
80 |
| router:external | False | |
81 |
+-----------------+-----------------------------------+ |
82 |
| public | False | |
83 |
+-----------------+-----------------------------------+ |
84 |
| status | ACTIVE | |
85 |
+-----------------+-----------------------------------+ |
86 |
| subnets | [] | |
87 |
+-----------------+-----------------------------------+ |
88 |
| user_id | 1012fd8c72284c00b133832cd179f896 | |
89 |
+-----------------+-----------------------------------+ |
90 |
| tenant_id | 1012fd8c72284c00b133832cd179f896 | |
91 |
+-----------------+-----------------------------------+ |
92 |
|
93 |
Delete a network |
94 |
^^^^^^^^^^^^^^^^ |
95 |
|
96 |
METHOD: DELETE |
97 |
|
98 |
URI: /networks/$(network_id) |
99 |
|
100 |
The network can not be deleted if there are any Ports connected to it or |
101 |
any FloatingIPs reserved from this network. The subnets that are connected |
102 |
to this network are automatically deleted upon network deletion. |
103 |
|
104 |
Update a network |
105 |
^^^^^^^^^^^^^^^^ |
106 |
|
107 |
METHOD: PUT |
108 |
|
109 |
URI: /networks/$(network_id) |
110 |
|
111 |
Only the name of the network can be updated. |
112 |
|
113 |
|
114 |
Subnets |
115 |
======= |
116 |
|
117 |
A subnet represents L3-Layer characteristics of the network that is |
118 |
associated with. Specifically it represents an IP address block that is |
119 |
used it assign addresses to virtual machines. A subnet is associated with |
120 |
a network when created. |
121 |
|
122 |
|
123 |
The attributes for subnet objects are the following: |
124 |
|
125 |
* id: A string represeting the UUID for the subnet. |
126 |
* name: A human readable name |
127 |
* network_id: The UUID of the network that the subnet is associated with. |
128 |
* ip_version: The IP version of the subnet. Can either be 4 or 6. |
129 |
* cidr: cidr representing IP range for this subnet, based on the IP version |
130 |
* gateway: Default gateway used by devices in this subnet. If not specified |
131 |
the gateway will be the first available IP address. Set to None in order to |
132 |
get no gateway. |
133 |
* enable_dhcp(CR): Boolean value indicating whether nfdhcpd is enabled for this |
134 |
subnet or not . |
135 |
* allocation_pools(CR): Subranges of cidr available for dynamic allocation. |
136 |
A list of dictionaries of the form {"start": "192.168.2.0", "end": 192.168.2.10"} |
137 |
* user_id/tenant_id: The UUID of the owner of the network. |
138 |
* host_routes(R): List of routes that should be used by devices with IPs from this |
139 |
subnet |
140 |
* dns_nameservers(R): List of DNS name servers used by hosts in this subnet. |
141 |
|
142 |
Note: 'host_routes' and 'dns_nameservers' is used only for compatibility with |
143 |
Neutron. These values will be read-only and always be []. |
144 |
|
145 |
|
146 |
Create a Subnet |
147 |
^^^^^^^^^^^^^^^ |
148 |
|
149 |
METHOD: POST |
150 |
|
151 |
URI: /subnets/ |
152 |
|
153 |
To create a subnet the used must specify the network_id and the cidr for the |
154 |
subnet. If the CIDR is IPv6 subnet, the user must set the ip_version to 6. |
155 |
If allocation pools overlap, or gateway overlaps with allocation_pools then 409 |
156 |
conflict is returned. |
157 |
|
158 |
Finally, the user can create maximum 1 subnet of each ip_version, meaning that |
159 |
a network can have no subnets, or one IPv4 subnet or one IPv6 subnet, or one |
160 |
IPv4 and one IPv6 subnet. Also the user can not create a subnet for a network |
161 |
that has or had a port connected to it. |
162 |
|
163 |
List user subnets |
164 |
^^^^^^^^^^^^^^^^^ |
165 |
|
166 |
METHOD: GET |
167 |
|
168 |
URI: /subnets/ |
169 |
|
170 |
Get details about a subnet |
171 |
^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
172 |
|
173 |
METHOD: GET |
174 |
|
175 |
URI: /subnets/$(subnet_id) |
176 |
|
177 |
Example response: |
178 |
|
179 |
+------------------+--------------------------------------------------+ |
180 |
| Field | Value | |
181 |
+==================+==================================================+ |
182 |
| allocation_pools | {"start": "192.168.2.2", "end": "192.168.2.254"} | |
183 |
+------------------+--------------------------------------------------+ |
184 |
| cidr | 192.168.2.0/24 | |
185 |
+------------------+--------------------------------------------------+ |
186 |
| dns_nameservers | [] | |
187 |
+------------------+--------------------------------------------------+ |
188 |
| enable_dhcp | False | |
189 |
+------------------+--------------------------------------------------+ |
190 |
| gateway_ip | 192.168.2.1 | |
191 |
+------------------+--------------------------------------------------+ |
192 |
| host_routes | [] | |
193 |
+------------------+--------------------------------------------------+ |
194 |
| id | 49ce3872-446c-43e9-aa22-68dbc2bac0b5 | |
195 |
+------------------+--------------------------------------------------+ |
196 |
| ip_version | 4 | |
197 |
+------------------+--------------------------------------------------+ |
198 |
| name | test1 | |
199 |
+------------------+--------------------------------------------------+ |
200 |
| network_id | 8fc5e2bf-9c1b-4458-8f71-e38177ed23a5 | |
201 |
+------------------+--------------------------------------------------+ |
202 |
| tenant_id | 11a65261147d462b998eafb7f696f0ba | |
203 |
+------------------+--------------------------------------------------+ |
204 |
| user_id | 11a65261147d462b998eafb7f696f0ba | |
205 |
+------------------+--------------------------------------------------+ |
206 |
|
207 |
|
208 |
Delete a subnet |
209 |
^^^^^^^^^^^^^^^^ |
210 |
|
211 |
METHOD: DELETE |
212 |
|
213 |
URI: /subnets/$(subnet_id) |
214 |
|
215 |
We will not allow deletion of subnets. Subnets will be deleted when network |
216 |
is deleted. This call will return 400 (badRequest). |
217 |
|
218 |
|
219 |
Update a subnet |
220 |
^^^^^^^^^^^^^^^^ |
221 |
|
222 |
METHOD: PUT |
223 |
|
224 |
URI: /subnets/$(subnet_id) |
225 |
|
226 |
|
227 |
Only the name of the subnet can be updated. This call will return 400 (badRequest) |
228 |
if the user tries to update any other field. |
229 |
|
230 |
|
231 |
Ports |
232 |
===== |
233 |
|
234 |
A port represent a virtual switch port on a network switch. Virtual machines |
235 |
attach their interefaces to ports. A port that is connected to a network |
236 |
gets an IP address for each subnet that is associated with the network. If the |
237 |
network has no subnets, then the port will have no IP. |
238 |
|
239 |
The attributes for port objects are the following: |
240 |
|
241 |
* id: A string represeting the UUID for the port. |
242 |
* network_id: The UUID of the network that this port is associated with. |
243 |
* name: A human readable name |
244 |
* status: String represetng the state of the port. Possible values for the |
245 |
state include: ACTIVE, DOWN, BUILD, ERROR |
246 |
* mac_address: MAC address |
247 |
* fixed_ips(R): List of dictionaries subnet_id->ip_address. |
248 |
* device_id(CR): Device using this port (VM id or Router id) |
249 |
* device_owner(CR): Entity using this port. e.g network:router, |
250 |
network:router_gateway |
251 |
* user_id/tenant_id: The UUID of the owner of the port. |
252 |
* security_groups(CRUD): List of security groups IDs associated with this port |
253 |
* admin_state_up: Boolean value indicating the administrative state of the |
254 |
port. If 'down' the port does not forward packets. |
255 |
|
256 |
|
257 |
Note: The 'admin_state_up' value is used only for compatibility with Neutron |
258 |
API. It will be read-only, and will always be True. |
259 |
|
260 |
Create a new Port |
261 |
^^^^^^^^^^^^^^^^^^^^ |
262 |
|
263 |
Method: POST |
264 |
|
265 |
URI: /ports |
266 |
|
267 |
The body of the request must contain the 'network_id' of the network that |
268 |
this port will be associated with and the 'device_id' that the port will |
269 |
be connected to. Also it can contain the following optional |
270 |
attributes: |
271 |
* security_groups |
272 |
* name |
273 |
|
274 |
The port will not have a MAC address and an IPv6 address until the |
275 |
corresponding NIC goes to ACTIVE state. This will be fixed when Cyclades |
276 |
will do MAC allocation. If MAC allocation is implemented, we will also |
277 |
be able to create a Port without specified a device_id. |
278 |
|
279 |
List ports |
280 |
^^^^^^^^^^^^^ |
281 |
|
282 |
Method: GET |
283 |
|
284 |
URI: /ports |
285 |
|
286 |
Get details about a port |
287 |
^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
288 |
|
289 |
METHOD: GET |
290 |
|
291 |
URI: /ports/$(port_id) |
292 |
|
293 |
Example response: |
294 |
|
295 |
+-----------------------+---------------------------------------------------------------------------------+ |
296 |
| Field | Value | |
297 |
+=======================+=================================================================================+ |
298 |
| admin_state_up | True | |
299 |
+-----------------------+---------------------------------------------------------------------------------+ |
300 |
| device_id | 39a02a66-33be-478a-8e9f-012141258678 | |
301 |
+-----------------------+---------------------------------------------------------------------------------+ |
302 |
| device_owner | network:router_interface | |
303 |
+-----------------------+---------------------------------------------------------------------------------+ |
304 |
| fixed_ips | {"subnet_id": "2313705f-68c1-4e16-80e3-c9fd8c0a5170", "ip_address": "10.0.2.1"} | |
305 |
+-----------------------+---------------------------------------------------------------------------------+ |
306 |
| id | ff15e3fe-7b39-4adc-ae98-a7e29588977e | |
307 |
+-----------------------+---------------------------------------------------------------------------------+ |
308 |
| mac_address | fa:16:3e:c1:63:06 | |
309 |
+-----------------------+---------------------------------------------------------------------------------+ |
310 |
| name | "test_port" | |
311 |
+-----------------------+---------------------------------------------------------------------------------+ |
312 |
| network_id | 2f04b49f-ca49-4b93-9139-11a4eca35fdd | |
313 |
+-----------------------+---------------------------------------------------------------------------------+ |
314 |
| security_groups | [] | |
315 |
+-----------------------+---------------------------------------------------------------------------------+ |
316 |
| status | DOWN | |
317 |
+-----------------------+---------------------------------------------------------------------------------+ |
318 |
| tenant_id | 1012fd8c72284c00b133832cd179f896 | |
319 |
+-----------------------+---------------------------------------------------------------------------------+ |
320 |
| user_id | 1012fd8c72284c00b133832cd179f896 | |
321 |
+-----------------------+---------------------------------------------------------------------------------+ |
322 |
|
323 |
Delete a port |
324 |
^^^^^^^^^^^^^^^^ |
325 |
|
326 |
METHOD: DELETE |
327 |
|
328 |
URI: /ports/$(port_id) |
329 |
|
330 |
Update a port |
331 |
^^^^^^^^^^^^^^^^ |
332 |
|
333 |
METHOD: PUT |
334 |
|
335 |
URI: /ports/$(port_id) |
336 |
|
337 |
Only the name of the port can be updated. |
338 |
|
339 |
General Implementation Details |
340 |
============================== |
341 |
|
342 |
Creation of a network corresponds to only creating a Network object in Cyclades |
343 |
DB. Also, creation of a subnet corresponds to creation of a Subnet in Cyclades |
344 |
DB and the corresponding allocation pools. The Ganeti network will only be |
345 |
created in the Ganeti backend when a port is connected to this network. |
346 |
Updating fields of Ganeti networks is really hard (e.g. changing the dhcp |
347 |
option) or impossible (e.g. changing the subnet). For this reason, if the |
348 |
network has been created in a Ganeti backend, then it will be marked as |
349 |
read-only! |
350 |
|
351 |
A port is directly mapped to a Ganeti NIC. The port will be created in DB in |
352 |
"BUILD" state and an OP_INSTANCE_MODIFY will be issued to Ganeti to create the |
353 |
NIC in the specified VM. When the job successfully completes, the NIC will be |
354 |
updated in DB to state "ACTIVE". Also the MAC address that was allocated from |
355 |
Ganeti will be stored in the updated NIC. |