Statistics
| Branch: | Tag: | Revision:

root / docs / design / cyclades-networking.rst @ ffbd11e9

History | View | Annotate | Download (21.9 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 a 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
internet)
15

    
16
Currently there are four available Networks Flavors:
17

    
18
* IP_LESS_ROUTED: 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 representing the UUID for the network.
31
* name: A human readable name.
32
* status: String representing the state of the network. Possible values for the
33
  state include: ACTIVE, DOWN, BUILD, ERROR or 'SNF:DRAINED' (no new ports
34
  or floating IPs can be created from this network).
35
* subnets: List of subnet UUIDs that are associated with this network.
36
* public: Whether network is visible to other users or not.
37
* user_id/tenant_id: The UUID of the owner of the network.
38
* admin_state_up: Boolean value indicating the administrative state of the
39
  network. If 'down' the network does not forward packets.
40
* router:external: Whether the network is connected to an external router or
41
  not. (/router API extension)
42
* SNF:floating_ip_pool: Whether the network can be used to allocate floating
43
  IPs.
44

    
45
Note: The 'admin_state_up' value is used only for compatibility with Neutron
46
API. It will be read-only, and will always be True.
47

    
48
Create a new network
49
^^^^^^^^^^^^^^^^^^^^
50

    
51
Method: POST
52

    
53
URI: /networks
54

    
55
The body of the request must contain the 'type' of the network. Also it can
56
contain a 'name' attribute.
57

    
58
List Networks
59
^^^^^^^^^^^^^
60

    
61
Method: GET
62

    
63
URI: /networks
64

    
65
Get details about a network
66
^^^^^^^^^^^^^^^^^^^^^^^^^^^
67

    
68
METHOD: GET
69

    
70
URI: /networks/$(network_id)
71

    
72
Example response:
73

    
74
+-----------------+-----------------------------------+
75
| Field           | Value                             |
76
+=================+===================================+
77
| admin_state_up  | True                              |
78
+-----------------+-----------------------------------+
79
| id              | 42                                |
80
+-----------------+-----------------------------------+
81
| name            | Test_network                      |
82
+-----------------+-----------------------------------+
83
| network_type    | MAC_FILTERED                      |
84
+-----------------+-----------------------------------+
85
| router:external | False                             |
86
+-----------------+-----------------------------------+
87
| public          | False                             |
88
+-----------------+-----------------------------------+
89
| status          | ACTIVE                            |
90
+-----------------+-----------------------------------+
91
| subnets         | []                                |
92
+-----------------+-----------------------------------+
93
| SNF:floating_ip | False                             |
94
+-----------------+-----------------------------------+
95
| user_id         | 1012fd8c72284c00b133832cd179f896  |
96
+-----------------+-----------------------------------+
97
| tenant_id       | 1012fd8c72284c00b133832cd179f896  |
98
+-----------------+-----------------------------------+
99

    
100
Delete a network
101
^^^^^^^^^^^^^^^^
102

    
103
METHOD: DELETE
104

    
105
URI:  /networks/$(network_id)
106

    
107
The network cannot be deleted if there are any Ports connected to it or
108
any FloatingIPs reserved from this network. The subnets that are connected
109
to this network are automatically deleted upon network deletion.
110

    
111
Update a network
112
^^^^^^^^^^^^^^^^
113

    
114
METHOD: PUT
115

    
116
URI:  /networks/$(network_id)
117

    
118
Only the name of the network can be updated.
119

    
120

    
121
Subnets
122
=======
123

    
124
A subnet represents L3-Layer characteristics of the network that is associated
125
with. Specifically, it represents an IP address block that is used in order to
126
assign addresses to virtual machines. A subnet is associated with a network
127
when created.
128

    
129

    
130
The attributes for subnet objects are the following:
131

    
132
* id: A string representing the UUID for the subnet.
133
* name: A human readable name.
134
* network_id: The UUID of the network that the subnet is associated with.
135
* ip_version: The IP version of the subnet. Can either be 4 or 6, default is 4.
136
* cidr: cidr representing IP range for this subnet, based on the IP version.
137
* gateway_ip: Default gateway used by devices in this subnet. If not specified
138
  the gateway will be the first available IP address. Set to None in order to
139
  get no gateway.
140
* enable_dhcp(CR): Boolean value indicating whether nfdhcpd is enabled for this
141
  subnet or not.
142
* enable_slaac: Boolean value indicating whether SLAAC is enabled for this
143
  subnet or not.
144
* allocation_pools(CR): Subranges of cidr available for dynamic allocation.
145
  A list of dictionaries of the form {"start": "192.168.2.0", "end": 192.168.2.10"}
146
* user_id/tenant_id: The UUID of the owner of the network.
147
* host_routes(R): List of routes that should be used by devices with IPs from
148
  this subnet.
149
* dns_nameservers(R): List of DNS name servers used by hosts in this subnet.
150

    
151
Note: 'host_routes' and 'dns_nameservers' is used only for compatibility with
152
Neutron. These values will be read-only and always be [].
153

    
154

    
155
Create a Subnet
156
^^^^^^^^^^^^^^^
157

    
158
METHOD: POST
159

    
160
URI:  /subnets/
161

    
162
To create a subnet the user must specify the network_id and the cidr for the
163
subnet. If the CIDR is an IPv6 subnet, the user must set the ip_version to 6.
164
If allocation pools overlap, or gateway overlaps with allocation_pools then 409
165
conflict is returned.
166

    
167
Finally, the user can create maximum one subnet of each ip_version, meaning
168
that a network can have no subnets, or one IPv4 subnet or one IPv6 subnet, or
169
one IPv4 and one IPv6 subnet. Also the user cannot create a subnet for a
170
network that has or had a port connected to it.
171

    
172
Note: Bulk creation of subnets, is not supported.
173

    
174
List user subnets
175
^^^^^^^^^^^^^^^^^
176

    
177
METHOD: GET
178

    
179
URI:  /subnets/
180

    
181
Get details about a subnet
182
^^^^^^^^^^^^^^^^^^^^^^^^^^^
183

    
184
METHOD: GET
185

    
186
URI:  /subnets/$(subnet_id)
187

    
188
Example response:
189

    
190
+------------------+--------------------------------------------------+
191
| Field            | Value                                            |
192
+==================+==================================================+
193
| allocation_pools | {"start": "192.168.2.2", "end": "192.168.2.254"} |
194
+------------------+--------------------------------------------------+
195
| cidr             | 192.168.2.0/24                                   |
196
+------------------+--------------------------------------------------+
197
| dns_nameservers  | []                                               |
198
+------------------+--------------------------------------------------+
199
| enable_dhcp      | False                                            |
200
+------------------+--------------------------------------------------+
201
| gateway_ip       | 192.168.2.1                                      |
202
+------------------+--------------------------------------------------+
203
| host_routes      | []                                               |
204
+------------------+--------------------------------------------------+
205
| id               | 49ce3872-446c-43e9-aa22-68dbc2bac0b5             |
206
+------------------+--------------------------------------------------+
207
| ip_version       | 4                                                |
208
+------------------+--------------------------------------------------+
209
| name             | test1                                            |
210
+------------------+--------------------------------------------------+
211
| network_id       | 8fc5e2bf-9c1b-4458-8f71-e38177ed23a5             |
212
+------------------+--------------------------------------------------+
213
| tenant_id        | 11a65261147d462b998eafb7f696f0ba                 |
214
+------------------+--------------------------------------------------+
215
| user_id          | 11a65261147d462b998eafb7f696f0ba                 |
216
+------------------+--------------------------------------------------+
217

    
218

    
219
Delete a subnet
220
^^^^^^^^^^^^^^^^
221

    
222
METHOD: DELETE
223

    
224
URI:  /subnets/$(subnet_id)
225

    
226
We do not allow deletion of subnets. Subnets will be deleted when the network
227
is deleted. This call will return 400 (badRequest).
228

    
229

    
230
Update a subnet
231
^^^^^^^^^^^^^^^^
232

    
233
METHOD: PUT
234

    
235
URI:  /subnets/$(subnet_id)
236

    
237

    
238
Only the name of the subnet can be updated. This call will return 400 (badRequest)
239
if the user tries to update any other field.
240

    
241

    
242
Ports
243
=====
244

    
245
A port represents a virtual switch port on a network switch. Virtual machines
246
attach their interfaces to ports. A port that is connected to a network
247
gets an IP address for each subnet that is associated with the network. If the
248
network has no subnets, then the port will have no IP.
249

    
250

    
251
The attributes for port objects are the following:
252

    
253
* id: A string representing the UUID for the port.
254
* network_id: The UUID of the network that this port is associated with.
255
* name: A human readable name.
256
* status: String representing the state of the port. Possible values for the
257
  state include: ACTIVE, DOWN, BUILD, ERROR.
258
* mac_address: MAC address.
259
* fixed_ips(R): List of dictionaries subnet_id->ip_address.
260
* device_id(CR): Device using this port (VM id or Router id).
261
* device_owner(CR): Entity using this port. e.g., network:router,
262
  network:router_gateway.
263
* user_id/tenant_id: The UUID of the owner of the port.
264
* security_groups(CRUD): List of security groups IDs associated with this port.
265
* admin_state_up: Boolean value indicating the administrative state of the
266
  port. If 'down' the port does not forward packets.
267

    
268
.. note:: Due to the way ports are implementing to Ganeti, a port will get an
269
  IPv6 address from a subnet only when the state of the port becomes 'ACTIVE'.
270

    
271
.. note:: The 'admin_state_up' value is used only for compatibility with
272
 Neutron API. It will be read-only, and will always be True.
273

    
274
Create a new Port
275
^^^^^^^^^^^^^^^^^^^^
276

    
277
Method: POST
278

    
279
URI: /ports
280

    
281
The body of the request must contain the 'network_id' of the network that
282
the port will be associated with. If the request contains a 'device_Id', the
283
port will be connected to that device.
284

    
285
The new port will get an IPv4 address from each of the subnets that are
286
associated with that network. If the network has an IPv4 subnet the request
287
can also contain the 'fixed_ips' attribute containing a specific IPv4 address
288
to use.
289

    
290
Creating a port to a public network is only supported if the user has a
291
floating IP from this network (see /floatingips extension) and the 'fixed_ip'
292
attribute of the request contains the IPv4 address of this floating IP.
293
Otherwise, badRequest(400) is returned.
294

    
295
Finally, the request can contain the following optional attributes:
296

    
297
* security_groups
298
* name
299

    
300
Example request:
301

    
302
.. code:: json
303

    
304
 {"port": {
305
     "name": "port1",
306
     "network_id": "42",
307
     "device_id": "2",
308
     "fixed_ips": [
309
         {
310
             "ip_address": "192.168.2.20"
311
         }
312
      ]
313
  }
314

    
315

    
316

    
317
List ports
318
^^^^^^^^^^^^^
319

    
320
Method: GET
321

    
322
URI: /ports
323

    
324
Get details about a port
325
^^^^^^^^^^^^^^^^^^^^^^^^^^^
326

    
327
METHOD: GET
328

    
329
URI:  /ports/$(port_id)
330

    
331
Example response:
332

    
333
+-----------------------+---------------------------------------------------------------------------------+
334
| Field                 | Value                                                                           |
335
+=======================+=================================================================================+
336
| admin_state_up        | True                                                                            |
337
+-----------------------+---------------------------------------------------------------------------------+
338
| device_id             | 39a02a66-33be-478a-8e9f-012141258678                                            |
339
+-----------------------+---------------------------------------------------------------------------------+
340
| device_owner          | network:router_interface                                                        |
341
+-----------------------+---------------------------------------------------------------------------------+
342
| fixed_ips             | {"subnet_id": "2313705f-68c1-4e16-80e3-c9fd8c0a5170", "ip_address": "10.0.2.1"} |
343
+-----------------------+---------------------------------------------------------------------------------+
344
| id                    | ff15e3fe-7b39-4adc-ae98-a7e29588977e                                            |
345
+-----------------------+---------------------------------------------------------------------------------+
346
| mac_address           | fa:16:3e:c1:63:06                                                               |
347
+-----------------------+---------------------------------------------------------------------------------+
348
| name                  | "test_port"                                                                     |
349
+-----------------------+---------------------------------------------------------------------------------+
350
| network_id            | 2f04b49f-ca49-4b93-9139-11a4eca35fdd                                            |
351
+-----------------------+---------------------------------------------------------------------------------+
352
| security_groups       | []                                                                              |
353
+-----------------------+---------------------------------------------------------------------------------+
354
| status                | DOWN                                                                            |
355
+-----------------------+---------------------------------------------------------------------------------+
356
| tenant_id             | 1012fd8c72284c00b133832cd179f896                                                |
357
+-----------------------+---------------------------------------------------------------------------------+
358
| user_id               | 1012fd8c72284c00b133832cd179f896                                                |
359
+-----------------------+---------------------------------------------------------------------------------+
360

    
361
Delete a port
362
^^^^^^^^^^^^^^^^
363

    
364
METHOD: DELETE
365

    
366
URI:  /ports/$(port_id)
367

    
368
Deleting a port from a public network is only allowed if the port has
369
been creating using a floating IP address.
370

    
371
Update a port
372
^^^^^^^^^^^^^^^^
373

    
374
METHOD: PUT
375

    
376
URI:  /ports/$(port_id)
377

    
378
Only the name of the port can be updated.
379

    
380

    
381

    
382
Floating IPs
383
============
384

    
385
Floating IPs are addresses on external networks (and so can be defined only on
386
networks on which the attribute `router:external` has been set to True) that
387
are marked as floating IP pools (`SNF:floating_ip_pool`). In the Neutron API,
388
floating IPs are associated with specific ports and IP addresses on private
389
networks and are used to allow an instance from a private network to access the
390
external network. Cyclades are able to associate a floating IP with an instance
391
without the restriction that the instance must already have a port and a
392
private IP from a private network. In order to avoid this limitation of Neutron
393
API, Cyclades are using a slightly modified and extended API.
394

    
395
The attributes of floating IP objects are the following:
396

    
397
* id: A string representing the UUID for the floating IP.
398
* floating_network_id: The UUID of the external network with which the floating
399
  IP is associated.
400
* floating_ip_address: The IPv4 address of the floating IP.
401
* fixed_ip_address: The value of this option is always `None`.
402
* port_id: The port that is currently using this floating IP.
403
* instance_id: The device that is currently using this floating IP.
404
* user_id/tenant_id: The UUID of the owner of the floating IP.
405

    
406

    
407
Floating IPs can be used via the /ports API. In order to attach a floating IP
408
to a server, the user must create a port that specified the IPv4 address
409
of the floating IP in the `fixed_ips` attribute of the port creation request.
410
Also, the floating IP can be detached from the server by destroying the
411
port that the floating IP is attached to.
412

    
413
Create(reserve) a floating IP
414
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
415

    
416
METHOD: POST
417

    
418
URI: /floatingips
419

    
420
The body of the request contains the id of the external network
421
(`floating_network_id`). If no address is specified (`floating_ip_address`),
422
an address will automatically be allocated from the pool addresses of the
423
external network.
424

    
425
List floating IPs
426
^^^^^^^^^^^^^^^^^
427

    
428
METHOD: GET
429

    
430
URI: /floatingips
431

    
432
Show a floating IP
433
^^^^^^^^^^^^^^^^^^
434

    
435
METHOD: GET
436

    
437
URI: /floatingips/$(floatingip_id)
438

    
439
Example response:
440

    
441
.. code-block:: console
442

    
443
 {
444
   "floatingip": {
445
     "id": "5923c02a-a162-4044-a432-9e52d6d819ce",
446
     "floating_ip_address": 192.168.1.227,
447
     "floating_network_id": 00983314-2f3c-43e9-acb0-9fd7cdb32231,
448
     "router_id": null,
449
     "device_id": 42,
450
     "tenant_id: "1012fd8c72284c00b133832cd179f896",
451
     "user_id": "1012fd8c72284c00b133832cd179f896"
452
   }
453
 }
454

    
455

    
456
Delete a Floating IP
457
^^^^^^^^^^^^^^^^^^^^
458

    
459
METHOD: DELETE
460

    
461
URI: /floatingips/$(floatingip_id)
462

    
463
This operation removes(releases) the floating IP. If it associated with a
464
device(port), the port is automatically removed.
465

    
466

    
467
Routers
468
=======
469

    
470

    
471
.. note:: This section contains a draft design document for virtual routers,
472
 and currently there is no implementation for this API.
473

    
474
A router is a logical entity that can be used to:
475

    
476
* interconnect subnets and forward traffic among them, and
477
* NAT internal traffic to external networks.
478

    
479
A router is associated with subnets through interfaces. The router gets an
480
interface with each subnet that is associated with. By default, the IP address
481
of such interface is the gateway of the subnet. Besides the interfaces, the
482
router also gets a Port for each network that is associated with (through
483
the corresponding subnets). These ports are created automatically when
484
interfaces are added to the router, have as device_owner the router, and
485
can not be managed with the Port API.
486

    
487
Besides the internal subnets, the router, can also be associated with an
488
external network in order to NAT traffic from internal networks to the external
489
one. The id of the external network is specified in the `external_gateway_info`
490
attribute of the network, and a port will be created for the router with an
491
IP address from the range of the public network. Besides the network id, the
492
user can also specify a floating IP from this network, to use as the router IP.
493
This port can also not be managed with the Port API.
494

    
495
The attributes for Router objects are the following:
496

    
497
* id: A string representing the UUID for the router.
498
* name: A human readable name.
499
* status: String representing the state of the network. Possible values for the
500
  state include: ACTIVE, DOWN, BUILD, ERROR.
501
* user_id/tenant_id: The UUID of the owner of the router.
502
* admin_state_up: Boolean value indicating the administrative state of the
503
  router. If 'down' the router does not forward packets.
504
* external_gateway_info: Dictionary with the information about the external
505
  gateway for the router.
506

    
507
Create a new router
508
^^^^^^^^^^^^^^^^^^^^
509

    
510
Method: POST
511

    
512
URI: /routers
513

    
514
The body of the request contains the name of the router. The new router that
515
is created does not have any internal interface and so it is not associated
516
with any subnet.
517

    
518
Also, the used can specify an external gateway for the router at create time.
519
This is done by specifying the network_id in the `external_gateway_info`
520
attribute. This network must have the attribute `router:external` set to
521
`True`. Besides the id of the network, the used can also specify one of his
522
floating IPs to use. An example request is the following
523

    
524

    
525
.. code-block:: console
526

    
527
  {
528
    "router":
529
    {
530
      "name": "example_router",
531
      "external_gateway_info":
532
      {
533
        "network_id": "42",
534
        "floating_ip_id": "142"
535
      }
536
    }
537
  }
538

    
539
List routers
540
^^^^^^^^^^^^^
541

    
542
Method: GET
543

    
544
URI: /routers
545

    
546
Get details about a router
547
^^^^^^^^^^^^^^^^^^^^^^^^^^^
548

    
549
METHOD: GET
550

    
551
URI: /routers/$(router_id)
552

    
553
Example response:
554

    
555
.. code-block:: console
556

    
557
  {
558
    "id": "5",
559
    "name": "example_router",
560
    "status": "ACTIVE",
561
    "user_id": "1012fd8c72284c00b133832cd179f896",
562
    "tenant_id": "1012fd8c72284c00b133832cd179f896",
563
    "external_gateway_info": {
564
      "network_id": "42",
565
      "floating_ip_id": "142"
566
    }
567
  }
568

    
569
Delete a router
570
^^^^^^^^^^^^^^^^
571

    
572
METHOD: DELETE
573

    
574
URI:  /routers/$(router_id)
575

    
576
This operation removes a logical router;
577
the operation will fail if the router still has some internal interfaces.
578

    
579
Update a router
580
^^^^^^^^^^^^^^^^
581

    
582
METHOD: PUT
583

    
584
URI:  /routers/$(router_id)
585

    
586
Only the `name` of the router and the `external_gateway_info` can be updated.
587

    
588
Add interface to router
589
^^^^^^^^^^^^^^^^^^^^^^^
590

    
591
METHOD: PUT
592

    
593
URI: /routers/$(router_id)/add_router_interface
594

    
595
The body of the request contains only the id of the subnet that the router
596
will be associated to.
597

    
598
Remove interface from router
599
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
600

    
601
METHOD: PUT
602

    
603
URI: /routers/$(router_id)/remove_router_interface
604

    
605
The body of the request contains only the id of the subnet that the router
606
will be detached from.
607

    
608

    
609

    
610

    
611
General Implementation Details
612
==============================
613

    
614
Creation of a network corresponds to only creating a Network object in the
615
Cyclades DB. Also, creation of a subnet corresponds to creation of a Subnet in
616
the Cyclades DB and the of the corresponding allocation pools. The Ganeti
617
network will only be created in the Ganeti backend when a port is connected to
618
this network.  Updating fields of Ganeti networks is really hard (e.g.,
619
changing the dhcp option) or impossible (e.g., changing the subnet). For this
620
reason, if the network has been created in a Ganeti backend, then it will be
621
marked as read-only!
622

    
623
A port is mapped to a Ganeti NIC directly. The port will be created in DB in
624
the "BUILD" state and an OP_INSTANCE_MODIFY will be issued to Ganeti to create
625
the NIC in the specified VM. When the job successfully completes, the NIC will
626
be updated to state "ACTIVE" in the DB. Also the MAC address that was allocated
627
from Ganeti will be stored in the updated NIC.