104 lines
3.8 KiB
Python
104 lines
3.8 KiB
Python
# Copyright 2014
|
|
# The Cloudscaling Group, Inc.
|
|
#
|
|
# 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.
|
|
|
|
import netaddr
|
|
from oslo_config import cfg
|
|
|
|
from gceapi.api import base_api
|
|
from gceapi.api import clients
|
|
from gceapi.api import operation_util
|
|
from gceapi.api import utils
|
|
from gceapi import exception
|
|
from gceapi.i18n import _
|
|
|
|
|
|
CONF = cfg.CONF
|
|
|
|
|
|
class API(base_api.API):
|
|
"""GCE Network API - nova-network implementation."""
|
|
|
|
KIND = "network"
|
|
PERSISTENT_ATTRIBUTES = ["id", "creationTimestamp", "description"]
|
|
|
|
def _get_type(self):
|
|
return self.KIND
|
|
|
|
def _get_persistent_attributes(self):
|
|
return self.PERSISTENT_ATTRIBUTES
|
|
|
|
def get_item(self, context, name, scope=None):
|
|
client = clients.nova(context)
|
|
try:
|
|
network = client.networks.find(label=name)
|
|
except clients.novaclient.exceptions.NotFound:
|
|
msg = _("Network resource '%s' could not be found.") % name
|
|
raise exception.NotFound(msg)
|
|
gce_network = self._get_db_item_by_id(context, network.id)
|
|
return self._prepare_network(utils.to_dict(network), gce_network)
|
|
|
|
def get_items(self, context, scope=None):
|
|
client = clients.nova(context)
|
|
networks = client.networks.list()
|
|
gce_networks = self._get_db_items_dict(context)
|
|
result_networks = []
|
|
for network in networks:
|
|
result_networks.append(
|
|
self._prepare_network(utils.to_dict(network),
|
|
gce_networks.get(network.id)))
|
|
self._purge_db(context, result_networks, gce_networks)
|
|
return result_networks
|
|
|
|
def delete_item(self, context, name, scope=None):
|
|
network = self.get_item(context, name)
|
|
self._process_callbacks(
|
|
context, base_api._callback_reasons.check_delete, network)
|
|
operation_util.start_operation(context)
|
|
self._delete_db_item(context, network)
|
|
self._process_callbacks(
|
|
context, base_api._callback_reasons.pre_delete, network)
|
|
client = clients.nova(context)
|
|
client.networks.delete(network["id"])
|
|
|
|
def add_item(self, context, name, body, scope=None):
|
|
ip_range = body.get('IPv4Range', CONF.default_network_ip_range)
|
|
gateway = body.get('gatewayIPv4')
|
|
if gateway is None:
|
|
network_cidr = netaddr.IPNetwork(ip_range)
|
|
gateway_ip = netaddr.IPAddress(network_cidr.first + 1)
|
|
gateway = str(gateway_ip)
|
|
network = None
|
|
try:
|
|
network = self.get_item(context, name)
|
|
except exception.NotFound:
|
|
pass
|
|
if network is not None:
|
|
raise exception.DuplicateVlan
|
|
kwargs = {'label': name, 'cidr': ip_range, 'gateway': gateway}
|
|
client = clients.nova(context)
|
|
operation_util.start_operation(context)
|
|
network = client.networks.create(**kwargs)
|
|
network = self._prepare_network(utils.to_dict(network))
|
|
if "description" in body:
|
|
network["description"] = body["description"]
|
|
return self._add_db_item(context, network)
|
|
|
|
def _prepare_network(self, network, db_data=None):
|
|
return self._prepare_item({
|
|
'name': network['label'],
|
|
'IPv4Range': network['cidr'],
|
|
'gatewayIPv4': network['gateway'],
|
|
'id': network['id']},
|
|
db_data)
|