![Roman Dobosz](/assets/img/avatar_default.png)
PodVIFDriver base class defines activate_vif method, which currently accepts two arguments - pod and vif. While vif argument is utilized for most of the time, pod is not. It was discovered during development, where there is a need for calling activate_vif method from within a CRD resource rather than pod. Change-Id: I6367bd93d5c0abe9a2ee6d018d997209f23f5318
76 lines
2.9 KiB
Python
76 lines
2.9 KiB
Python
# Copyright (C) 2020 Intel Corporation
|
|
# 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.
|
|
|
|
from openstack import exceptions as o_exc
|
|
from oslo_log import log as logging
|
|
|
|
from kuryr_kubernetes import clients
|
|
from kuryr_kubernetes.controller.drivers import nested_vif
|
|
from kuryr_kubernetes.controller.drivers import utils
|
|
from kuryr_kubernetes import os_vif_util as ovu
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class NestedDpdkPodVIFDriver(nested_vif.NestedPodVIFDriver):
|
|
"""Manages ports for DPDK based nested-containers to provide VIFs."""
|
|
|
|
# TODO(garyloug): maybe log a warning if the vswitch is not ovs-dpdk?
|
|
|
|
def request_vif(self, pod, project_id, subnets, security_groups):
|
|
os_net = clients.get_network_client()
|
|
compute = clients.get_compute_client()
|
|
|
|
vm_id = self._get_parent_port(pod).device_id
|
|
net_id = utils.get_network_id(subnets)
|
|
|
|
try:
|
|
result = compute.create_server_interface(vm_id, net_id=net_id)
|
|
except o_exc.SDKException:
|
|
LOG.warning("Unable to create interface for server %s.",
|
|
vm_id)
|
|
raise
|
|
port = os_net.get_port(result.port_id)
|
|
return ovu.neutron_to_osvif_vif_dpdk(port, subnets, pod)
|
|
|
|
def request_vifs(self, pod, project_id, subnets, security_groups,
|
|
num_ports):
|
|
# TODO(garyloug): provide an implementation
|
|
raise NotImplementedError()
|
|
|
|
def release_vif(self, pod, vif, project_id=None, security_groups=None):
|
|
compute = clients.get_compute_client()
|
|
|
|
vm_id = self._get_parent_port(pod).device_id
|
|
LOG.debug("release_vif for vm_id %s %s", vm_id, vif.id)
|
|
|
|
try:
|
|
compute.delete_server_interface(vif.id, server=vm_id)
|
|
except o_exc.SDKException:
|
|
LOG.warning("Unable to delete interface %s for server %s.",
|
|
vif.id, vm_id)
|
|
raise
|
|
|
|
def activate_vif(self, vif):
|
|
# NOTE(danil): new virtual interface was created in nova instance
|
|
# during request_vif call, thus if it was not created successfully
|
|
# an exception o_exc.SDKException would be throwed. During binding
|
|
# process only rebinding of interface on userspace driver was done.
|
|
# There is no any chance to check the state of rebinded interface.
|
|
# Thus just set 'active' immediately to let the CNI driver make
|
|
# progress.
|
|
vif.active = True
|