95b49fad57
bug #1012438 Additional work for bp v2-api-melange-integration - rename few attributes: op_state -> status additional_routes -> additional_host_routes prefix -> cidr - expand request body validation to indicate whether fields can be specified during create and or update. - add test cases to validate defaults, and input validation. - update db_base_plugin_v2 to generate gateway_ip for subnet and mac for port when unspecified. - validate that tenant-id is only specified in req by admin users - automatically set tenant-id based on request.context.tenant_id if needed - enable port tests in test_db_plugin.py Change-Id: If7f5101e4974a6ef93ff8a1d945f8642dd21b16e
197 lines
7.4 KiB
Python
197 lines
7.4 KiB
Python
# Copyright 2011 Nicira Networks, Inc.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
# @author: Dan Wendlandt, Nicira, Inc.
|
|
|
|
"""
|
|
v2 Quantum Plug-in API specification.
|
|
|
|
QuantumPluginBase provides the definition of minimum set of
|
|
methods that needs to be implemented by a v2 Quantum Plug-in.
|
|
"""
|
|
|
|
from abc import ABCMeta, abstractmethod
|
|
|
|
|
|
class QuantumPluginBaseV2(object):
|
|
|
|
__metaclass__ = ABCMeta
|
|
|
|
@abstractmethod
|
|
def create_subnet(self, context, subnet):
|
|
"""
|
|
Create a subnet, which represents a range of IP addresses
|
|
that can be allocated to devices
|
|
: param subnet_data: data describing the prefix
|
|
{
|
|
"network_id": UUID of the network to which this subnet
|
|
is bound.
|
|
"ip_version": integer indicating IP protocol version.
|
|
example: 4
|
|
"cidr": string indicating IP prefix indicating addresses
|
|
that can be allocated for devices on this subnet.
|
|
example: "10.0.0.0/24"
|
|
"gateway_ip": string indicating the default gateway
|
|
for devices on this subnet. example: "10.0.0.1"
|
|
"dns_nameservers": list of strings stricting indication the
|
|
DNS name servers for devices on this
|
|
subnet. example: [ "8.8.8.8", "8.8.4.4" ]
|
|
"reserved_ranges" : list of dicts indicating pairs of IPs that
|
|
should not be automatically allocated from
|
|
the prefix.
|
|
example: [ { "start" : "10.0.0.2",
|
|
"end" : "10.0.0.5" } ]
|
|
"additional_host_routes": list of dicts indicating routes beyond
|
|
the default gateway and local prefix route
|
|
that should be injected into the device.
|
|
example: [{"destination": "192.168.0.0/16",
|
|
"nexthop": "10.0.0.5" } ]
|
|
}
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def update_subnet(self, context, id, subnet):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_subnet(self, context, id, fields=None, verbose=None):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def delete_subnet(self, context, id):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_subnets(self, context, filters=None, fields=None, verbose=None):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def create_network(self, context, network):
|
|
"""
|
|
Creates a new Virtual Network, assigns a name and associates
|
|
|
|
:param net_data:
|
|
{
|
|
'name': a human-readable name associated
|
|
with network referenced by net-id
|
|
example: "net-1"
|
|
'admin-state-up': indicates whether this network should
|
|
be operational.
|
|
'subnets': list of subnet uuids associated with this
|
|
network.
|
|
}
|
|
:raises:
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def update_network(self, context, id, network):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def delete_network(self, context, id):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_network(self, context, id, fields=None, verbose=None):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_networks(self, context, filters=None, fields=None, verbose=None):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def create_port(self, context, port):
|
|
"""
|
|
Creates a port on the specified Virtual Network. Optionally
|
|
specify customization of port IP-related attributes, otherwise
|
|
the port gets the default values of these attributes associated with
|
|
the subnet.
|
|
|
|
:param port_data:
|
|
{"network_id" : UUID of network that this port is attached to.
|
|
"admin-state-up" : boolean indicating whether this port should be
|
|
operational.
|
|
"mac_address" : (optional) mac address used on this port. If no
|
|
value is specified, the plugin will generate a
|
|
MAC address based on internal configuration.
|
|
"fixed_ips" : (optional) list of dictionaries describing the
|
|
fixed IPs to be allocated for use by the device on
|
|
this port. If not specified, the plugin will
|
|
attempt to find a v4 and v6 subnet associated
|
|
with the network and allocate an IP for that
|
|
subnet.
|
|
Note: "address" is optional, in which case an
|
|
address from the specified subnet is
|
|
selected.
|
|
example: [{"subnet": "<uuid>",
|
|
"address": "10.0.0.9"}]
|
|
"routes" : (optional) list of routes to be injected into this
|
|
device. If not specified, the port will get a
|
|
route for its local subnet, a route for the default
|
|
gateway, and each of the routes in the
|
|
'additional_routes' field of the subnet.
|
|
example: [ { "destination" : "192.168.0.0/16",
|
|
"nexthop" : "10.0.0.5" } ]
|
|
}
|
|
:raises: exception.NetworkNotFound
|
|
:raises: exception.RequestedFixedIPNotAvailable
|
|
:raises: exception.FixedIPNotAvailable
|
|
:raises: exception.RouteInvalid
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def update_port(self, context, id, port):
|
|
"""
|
|
Updates the attributes of a specific port on the
|
|
specified Virtual Network.
|
|
|
|
:returns: a mapping sequence with the following signature:
|
|
{'port-id': uuid representing the
|
|
updated port on specified quantum network
|
|
'port-state': update port state( UP or DOWN)
|
|
}
|
|
:raises: exception.StateInvalid
|
|
:raises: exception.PortNotFound
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def delete_port(self, context, id):
|
|
"""
|
|
Deletes a port on a specified Virtual Network,
|
|
if the port contains a remote interface attachment,
|
|
the remote interface is first un-plugged and then the port
|
|
is deleted.
|
|
|
|
:returns: a mapping sequence with the following signature:
|
|
{'port-id': uuid representing the deleted port
|
|
on specified quantum network
|
|
}
|
|
:raises: exception.PortInUse
|
|
:raises: exception.PortNotFound
|
|
:raises: exception.NetworkNotFound
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_port(self, context, id, fields=None, verbose=None):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_ports(self, context, filters=None, fields=None, verbose=None):
|
|
pass
|