コード例 #1
0
    def test_missing(self):
        depl = resource.VmmInjectedDeployment(
            **{
                'display_name': '',
                'name': 'kubedns',
                'replicas': 1,
                'domain_name': 'kube',
                'controller_name': 'kube',
                'domain_type': 'Kubernetes',
                'guid': 'a',
                'namespace_name': 'k'
            })
        ns = resource.VmmInjectedNamespace(
            **{
                'display_name': '',
                'name': 'k',
                'domain_name': 'kube',
                'controller_name': 'kube',
                'domain_type': 'Kubernetes'
            })
        updates = [depl, ns, ns]

        mgr = aim_manager.AimManager()

        tt_maker = tree_manager.AimHashTreeMaker()
        tt_builder = tree_manager.HashTreeBuilder(mgr)
        trees = {}

        exp_key = tt_maker._build_hash_tree_key(depl)

        for aim_res in updates:
            key = tt_maker.get_root_key(aim_res)
            if key and trees is not None:
                cfg = trees.setdefault(tt_builder.CONFIG, {}).setdefault(
                    key, tree.StructuredHashTree())
                mo = trees.setdefault(tt_builder.MONITOR,
                                      {}).setdefault(key,
                                                     tree.StructuredHashTree())
                oper = trees.setdefault(tt_builder.OPER, {}).setdefault(
                    key, tree.StructuredHashTree())

                tt_builder.build(
                    [aim_res], [], [], {
                        tt_builder.CONFIG: {
                            key: cfg
                        },
                        tt_builder.MONITOR: {
                            key: mo
                        },
                        tt_builder.OPER: {
                            key: oper
                        }
                    },
                    aim_ctx=self.ctx)

            if not isinstance(aim_res, resource.VmmInjectedDeployment):
                self.assertIsNotNone(cfg.find(exp_key),
                                     'Resource %s' % aim_res)
                self.assertIsNotNone(trees['config']['comp'].find(exp_key),
                                     'Resource %s' % aim_res)
コード例 #2
0
    def __init__(self,
                 tenant_name,
                 apic_config,
                 apic_session,
                 ws_context,
                 creation_succeeded=None,
                 creation_failed=None,
                 aim_system_id=None,
                 get_resources=None,
                 *args,
                 **kwargs):
        super(AciTenantManager, self).__init__(*args, **kwargs)
        LOG.info("Init manager for tenant %s" % tenant_name)
        self.get_resources = get_resources
        self.apic_config = apic_config
        # Each tenant has its own sessions
        self.aci_session = apic_session
        self.dn_manager = apic_client.DNManager()
        self.tenant_name = tenant_name
        children_mos = get_children_mos(self.aci_session, self.tenant_name)
        ws_subscription_to = self.apic_config.get_option(
            'websocket_subscription_timeout', 'aim') or DEFAULT_WS_TO
        self.tenant = Root(self.tenant_name,
                           filtered_children=children_mos,
                           rn=self.tenant_name,
                           ws_subscription_to=ws_subscription_to)
        self._state = structured_tree.StructuredHashTree()
        self._operational_state = structured_tree.StructuredHashTree()
        self._monitored_state = structured_tree.StructuredHashTree()
        self.polling_yield = self.apic_config.get_option(
            'aci_tenant_polling_yield', 'aim')
        self.to_aim_converter = converter.AciToAimModelConverter()
        self.to_aci_converter = converter.AimToAciModelConverter()
        self._reset_object_backlog()
        self.tree_builder = tree_manager.HashTreeBuilder(None)
        self.tag_name = aim_system_id or self.apic_config.get_option(
            'aim_system_id', 'aim')
        self.tag_set = set()
        self.failure_log = {}

        def noop(*args, **kwargs):
            pass

        self.creation_succeeded = creation_succeeded or noop
        self.creation_failed = creation_failed or noop
        # Warm bit to avoid rushed synchronization before receiving the first
        # batch of APIC events
        self._warm = False
        self.ws_context = ws_context
        self.recovery_retries = None
        self.max_retries = 5
        self.error_handler = error.APICAPIErrorHandler()
        # For testing purposes
        self.num_loop_runs = float('inf')
コード例 #3
0
    def __init__(self, ctx=None, *args, **kwargs):
        self.ctx = ctx or context.AimContext(store=api.get_store())
        if 'streaming' not in self.ctx.store.features:
            # TODO(ivar) raise something meaningful
            raise Exception
        self.mgr = aim_manager.AimManager()
        self.tt_mgr = tree_manager.HashTreeManager()
        self.tt_maker = tree_manager.AimHashTreeMaker()
        self.tt_builder = tree_manager.HashTreeBuilder(self.mgr)
        self.klient = self.ctx.store.klient
        self.namespace = self.ctx.store.namespace
        self.trees = {}
        self.q = queue.Queue()
        self.event_handler = event_handler.EventHandler
        self._stop = False
        self._http_resp = None
        # Tenants whose trees need to be saved in AIM
        self.affected_tenants = set()
        self._observe_thread_state = {}

        self._k8s_types_to_observe = set([])
        self._k8s_aim_type_map = {}
        self._k8s_kinds = set([])
        self._needs_init = True

        for aim_res in aim_manager.AimManager.aim_resources:
            if issubclass(aim_res, resource.AciResourceBase):
                k8s_type = self.ctx.store.resource_to_db_type(aim_res)
                for ktype in ([k8s_type] + k8s_type.aux_objects.values()):
                    self._k8s_types_to_observe.add(ktype)
                    self._k8s_kinds.add(ktype.kind)
                    if ktype != api_v1.AciContainersObject:
                        self._k8s_aim_type_map[ktype.kind] = (aim_res,
                                                              k8s_type)

        self._event_filters = {
            api_v1.Pod: self._pod_event_filter,
            api_v1.Endpoints: self._endpoints_event_filter
        }
コード例 #4
0
    def test_sync_object_status(self):
        mgr = aim_manager.AimManager()
        epg = mgr.create(
            self.ctx,
            resource.EndpointGroup(tenant_name='test',
                                   app_profile_name='test',
                                   name='test',
                                   sync=False))
        status = mgr.get_status(self.ctx, epg)
        mgr.update(self.ctx, status, sync_status=status.SYNCED)
        tt_builder = tree_manager.HashTreeBuilder(mgr)
        trees = {}
        tt_maker = tree_manager.AimHashTreeMaker()
        key = tt_maker.get_root_key(epg)
        cfg = trees.setdefault(tt_builder.CONFIG,
                               {}).setdefault(key, tree.StructuredHashTree())
        mo = trees.setdefault(tt_builder.MONITOR,
                              {}).setdefault(key, tree.StructuredHashTree())
        oper = trees.setdefault(tt_builder.OPER,
                                {}).setdefault(key, tree.StructuredHashTree())

        tt_builder.build(
            [status], [], [], {
                tt_builder.CONFIG: {
                    key: cfg
                },
                tt_builder.MONITOR: {
                    key: mo
                },
                tt_builder.OPER: {
                    key: oper
                }
            },
            aim_ctx=self.ctx)
        # Should not add parent back
        exp_key = tt_maker._build_hash_tree_key(epg)
        self.assertIsNone(cfg.find(exp_key))
コード例 #5
0
 def __init__(self, aim_manager):
     self.aim_manager = aim_manager
     self.tt_mgr = tree_manager.HashTreeManager()
     self.tt_maker = tree_manager.AimHashTreeMaker()
     self.tt_builder = tree_manager.HashTreeBuilder(self.aim_manager)