def test__check_annotations_succeed(self):
        ann_objs = [
            vif.PodState(default_vif=vif.VIFMacvlanNested(vif_name='foo')),
            vif.PodState(default_vif=vif.VIFMacvlanNested(vif_name='bar')),
        ]
        ann_objs = [jsonutils.dumps(ann.obj_to_primitive())
                    for ann in ann_objs]

        self._test__check_annotations(ann_objs, 0)
    def _test__convert_annotations(self, method, calls):
        self.cmd.k8s.annotate = mock.Mock()

        ann_objs = [
            ('foo',
             vif.PodState(default_vif=vif.VIFMacvlanNested(vif_name='foo'))),
            ('bar', vif.VIFMacvlanNested(vif_name='bar')),
        ]
        ann_objs = [(name, jsonutils.dumps(ann.obj_to_primitive()))
                    for name, ann in ann_objs]

        pods = {
            'items': [
                {
                    'metadata': {
                        'annotations': {
                            constants.K8S_ANNOTATION_VIF: ann
                        },
                        'selfLink': name,
                        'resourceVersion': 1,
                    }
                } for name, ann in ann_objs
            ]
        }
        self.cmd.k8s = mock.Mock(get=mock.Mock(return_value=pods))
        method()
        for args in calls:
            self.cmd.k8s.annotate.assert_any_call(*args)
예제 #3
0
    def setUp(self):
        super(TestVIFHandler, self).setUp()

        self._project_id = mock.sentinel.project_id
        self._subnets = mock.sentinel.subnets
        self._security_groups = mock.sentinel.security_groups
        self._vif = os_obj.vif.VIFBase()
        self._vif.active = True
        self._vif_serialized = mock.sentinel.vif_serialized
        self._multi_vif_drv = mock.MagicMock(spec=drivers.MultiVIFDriver)
        self._additioan_vifs = []
        self._state = vif.PodState(default_vif=self._vif)

        self._pod_version = mock.sentinel.pod_version
        self._pod_link = mock.sentinel.pod_link
        self._pod_namespace = mock.sentinel.namespace
        self._pod = {
            'metadata': {
                'resourceVersion': self._pod_version,
                'selfLink': self._pod_link,
                'namespace': self._pod_namespace
            },
            'status': {
                'phase': k_const.K8S_POD_STATUS_PENDING
            },
            'spec': {
                'hostNetwork': False,
                'nodeName': 'hostname'
            }
        }

        self._handler = mock.MagicMock(spec=h_vif.VIFHandler)
        self._handler._drv_project = mock.Mock(spec=drivers.PodProjectDriver)
        self._handler._drv_subnets = mock.Mock(spec=drivers.PodSubnetsDriver)
        self._handler._drv_sg = mock.Mock(spec=drivers.PodSecurityGroupsDriver)
        self._handler._drv_vif = mock.Mock(spec=drivers.PodVIFDriver)
        self._handler._drv_vif_pool = mock.MagicMock(
            spec=drivers.VIFPoolDriver)
        self._handler._drv_multi_vif = [self._multi_vif_drv]

        self._get_project = self._handler._drv_project.get_project
        self._get_subnets = self._handler._drv_subnets.get_subnets
        self._get_security_groups = self._handler._drv_sg.get_security_groups
        self._set_vifs_driver = self._handler._drv_vif_pool.set_vif_driver
        self._request_vif = self._handler._drv_vif_pool.request_vif
        self._release_vif = self._handler._drv_vif_pool.release_vif
        self._activate_vif = self._handler._drv_vif_pool.activate_vif
        self._set_pod_state = self._handler._set_pod_state
        self._is_pending_node = self._handler._is_pending_node
        self._request_additional_vifs = \
            self._multi_vif_drv.request_additional_vifs

        self._request_vif.return_value = self._vif
        self._request_additional_vifs.return_value = self._additioan_vifs
        self._is_pending_node.return_value = True
        self._get_project.return_value = self._project_id
        self._get_subnets.return_value = self._subnets
        self._get_security_groups.return_value = self._security_groups
        self._set_vifs_driver.return_value = mock.Mock(
            spec=drivers.PodVIFDriver)
예제 #4
0
 def test_extract_pod_annotation(self):
     vif_obj = objects.vif.VIFBase()
     ps = vif.PodState(default_vif=vif_obj)
     d = ps.obj_to_primitive()
     result = utils.extract_pod_annotation(d)
     self.assertEqual(vif.PodState.obj_name(), result.obj_name())
     self.assertEqual(vif_obj, result.default_vif)
    def test__check_annotations_malformed(self):
        ann_objs = [
            vif.PodState(default_vif=vif.VIFMacvlanNested(vif_name='foo')),
        ]
        ann_objs = [jsonutils.dumps(ann.obj_to_primitive())
                    for ann in ann_objs]
        ann_objs.append('{}')

        self._test__check_annotations(ann_objs, 1)
예제 #6
0
def extract_pod_annotation(annotation):
    obj = objects.base.VersionedObject.obj_from_primitive(annotation)
    # FIXME(dulek): This is code to maintain compatibility with Queens. We can
    #               remove it once we stop supporting upgrading from Queens,
    #               most likely in Stein. Note that this requires being sure
    #               that *all* the pod annotations are in new format.
    if obj.obj_name() != vif.PodState.obj_name():
        # This is old format of annotations - single VIF object. We need to
        # pack it in PodState object.
        obj = vif.PodState(default_vif=obj)

    return obj
    def test__get_annotation_existing(self):
        mock_obj = vif.PodState(
            default_vif=vif.VIFMacvlanNested(vif_name='foo'))

        pod = {
            'metadata': {
                'annotations': {
                    constants.K8S_ANNOTATION_VIF: jsonutils.dumps(
                        mock_obj.obj_to_primitive())
                }
            }
        }

        obj = self.cmd._get_annotation(pod)
        self.assertEqual(mock_obj, obj)
예제 #8
0
    def test_move_annotations_to_crd_with_annotations(self, m_get_k8s_client):
        vifobj = os_obj.vif.VIFOpenVSwitch()
        state = vif.PodState(default_vif=vifobj)
        annotation = jsonutils.dumps(state.obj_to_primitive())
        self._pod['metadata']['annotations'] = {
            k_const.K8S_ANNOTATION_VIF: annotation}
        vifs = {'eth0': {'default': True, 'vif': vifobj.obj_to_primitive()}}
        k8s = mock.MagicMock()
        m_get_k8s_client.return_value = k8s

        res = h_vif.VIFHandler._move_annotations_to_crd(self._handler,
                                                        self._pod)
        self.assertTrue(res)
        self._handler._add_kuryrport_crd.assert_called_once_with(self._pod,
                                                                 vifs)

        m_get_k8s_client.assert_called_once()
        k8s.remove_annotations.assert_called_once_with(
            self._pod['metadata']['selfLink'], k_const.K8S_ANNOTATION_VIF)
예제 #9
0
 def update_fn(obj):
     if obj.obj_name() != objects.vif.PodState.obj_name():
         return vif.PodState(default_vif=obj)
     return self._convert_sriov(obj)
예제 #10
0
 def update_fn(obj):
     return vif.PodState(default_vif=obj)
예제 #11
0
    def setUp(self):
        super(TestVIFHandler, self).setUp()

        self._project_id = mock.sentinel.project_id
        self._subnets = mock.sentinel.subnets
        self._security_groups = mock.sentinel.security_groups
        self._vif = os_obj.vif.VIFBase()
        self._vif.active = True
        self._vif_serialized = mock.sentinel.vif_serialized
        self._multi_vif_drv = mock.MagicMock(spec=drivers.MultiVIFDriver)
        self._additioan_vifs = []
        self._state = vif.PodState(default_vif=self._vif)

        self._pod_version = mock.sentinel.pod_version
        self._pod_link = mock.sentinel.pod_link
        self._pod_namespace = mock.sentinel.namespace
        self._pod_uid = mock.sentinel.pod_uid
        self._pod_name = 'pod1'
        self._pod = {
            'metadata': {'resourceVersion': self._pod_version,
                         'selfLink': self._pod_link,
                         'name': self._pod_name,
                         'namespace': self._pod_namespace},
            'status': {'phase': k_const.K8S_POD_STATUS_PENDING},
            'spec': {'hostNetwork': False,
                     'nodeName': 'hostname'}
        }

        self._kp_version = mock.sentinel.kp_version
        self._kp_link = mock.sentinel.kp_link
        self._kp = {'apiVersion': 'openstack.org/v1',
                    'kind': 'KuryrPort',
                    'metadata': {'resourceVersion': self._kp_version,
                                 'selfLink': mock.sentinel.kp_link,
                                 'namespace': self._pod_namespace,
                                 'labels': mock.ANY},
                    'spec': {'podUid': self._pod_uid,
                             'podNodeName': 'hostname'},
                    'status': {'vifs': {}}}

        self._handler = mock.MagicMock(spec=h_vif.VIFHandler)
        self._handler._drv_project = mock.Mock(spec=drivers.PodProjectDriver)
        self._handler._drv_subnets = mock.Mock(spec=drivers.PodSubnetsDriver)
        self._handler._drv_sg = mock.Mock(spec=drivers.PodSecurityGroupsDriver)
        self._handler._drv_vif = mock.Mock(spec=drivers.PodVIFDriver)
        self._handler._drv_vif_pool = mock.MagicMock(
            spec=drivers.VIFPoolDriver)
        self._handler._drv_multi_vif = [self._multi_vif_drv]

        self._get_project = self._handler._drv_project.get_project
        self._get_subnets = self._handler._drv_subnets.get_subnets
        self._get_security_groups = self._handler._drv_sg.get_security_groups
        self._set_vifs_driver = self._handler._drv_vif_pool.set_vif_driver
        self._request_vif = self._handler._drv_vif_pool.request_vif
        self._release_vif = self._handler._drv_vif_pool.release_vif
        self._activate_vif = self._handler._drv_vif_pool.activate_vif
        self._matc = self._handler._move_annotations_to_crd
        self._is_pod_scheduled = self._handler._is_pod_scheduled
        self._is_pod_completed = self._handler._is_pod_completed
        self._request_additional_vifs = \
            self._multi_vif_drv.request_additional_vifs

        self._request_vif.return_value = self._vif
        self._request_additional_vifs.return_value = self._additioan_vifs
        self._is_pod_scheduled.return_value = True
        self._is_pod_completed.return_value = False
        self._get_project.return_value = self._project_id
        self._get_subnets.return_value = self._subnets
        self._get_security_groups.return_value = self._security_groups
        self._set_vifs_driver.return_value = mock.Mock(
            spec=drivers.PodVIFDriver)