Statistics
| Branch: | Tag: | Revision:

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.