def test_etcd_watchers_init_with_conf_values(self, *_):
        agent = CalicoDhcpAgent()

        provided_kwargs = get_etcd_connection_settings()

        def check_provided_args(watcher_obj, expected_key_to_poll):
            for attr_name in ('etcd_scheme', 'etcd_key', 'etcd_cert',
                              'etcd_ca'):
                self.assertEqual(getattr(watcher_obj, attr_name),
                                 provided_kwargs[attr_name])

            # provided hosts are stored in form of list [(host, port)...]
            # on etcd watcher
            etcd_host, etcd_port = provided_kwargs['etcd_addrs'].split(':')
            self.assertEqual(watcher_obj.etcd_hosts,
                             [(etcd_host, int(etcd_port))])

            self.assertEqual(watcher_obj.key_to_poll, expected_key_to_poll)

        expected_key = \
            datamodel_v1.dir_for_host(socket.gethostname()) + '/workload'
        check_provided_args(agent.etcd, expected_key)

        expected_key = datamodel_v1.SUBNET_DIR
        check_provided_args(agent.etcd.subnet_watcher, expected_key)
    def test_etcd_watchers_init_with_conf_values(self, *_):
        agent = CalicoDhcpAgent()

        provided_kwargs = get_etcd_connection_settings()

        def check_provided_args(watcher_obj, expected_key_to_poll):
            for attr_name in ('etcd_scheme', 'etcd_key',
                              'etcd_cert', 'etcd_ca'):
                self.assertEqual(
                    getattr(watcher_obj, attr_name),
                    provided_kwargs[attr_name]
                )

            # provided hosts are stored in form of list [(host, port)...]
            # on etcd watcher
            etcd_host, etcd_port = provided_kwargs['etcd_addrs'].split(':')
            self.assertEqual(watcher_obj.etcd_hosts,
                             [(etcd_host, int(etcd_port))])

            self.assertEqual(watcher_obj.key_to_poll, expected_key_to_poll)

        expected_key = \
            datamodel_v1.dir_for_host(socket.gethostname()) + '/workload'
        check_provided_args(agent.etcd, expected_key)

        expected_key = datamodel_v1.SUBNET_DIR
        check_provided_args(agent.etcd.subnet_watcher, expected_key)
    def __init__(self, agent):
        watcher_kwargs = get_etcd_connection_settings()
        watcher_kwargs['key_to_poll'] = \
            datamodel_v1.dir_for_host(socket.gethostname()) + "/workload"
        super(CalicoEtcdWatcher, self).__init__(**watcher_kwargs)
        self.agent = agent
        self.suppress_dnsmasq_updates = False

        # Register the etcd paths that we need to watch.
        self.register_path(
            "/calico/v1/host/<hostname>/workload/<orchestrator>" +
            "/<workload_id>/endpoint/<endpoint_id>",
            on_set=self.on_endpoint_set,
            on_del=self.on_endpoint_delete
        )
        self.register_path(
            "/calico/v1/host/<hostname>/workload/<orchestrator>" +
            "/<workload_id>/endpoint",
            on_del=self.on_dir_delete
        )
        self.register_path(
            "/calico/v1/host/<hostname>/workload/<orchestrator>" +
            "/<workload_id>",
            on_del=self.on_dir_delete
        )
        self.register_path(
            "/calico/v1/host/<hostname>/workload/<orchestrator>",
            on_del=self.on_dir_delete
        )
        self.register_path(
            "/calico/v1/host/<hostname>/workload",
            on_del=self.on_dir_delete
        )

        # Networks for which Dnsmasq needs updating.
        self.dirty_networks = set()

        # Subnets that have changed in etcd since when we last read them.
        self.dirty_subnets = set()

        # Also watch the etcd subnet tree.  When something in that subtree
        # changes, the subnet watcher will tell _this_ watcher to resync.
        self.subnet_watcher = SubnetWatcher(self)
        eventlet.spawn(self.subnet_watcher.loop)
    def __init__(self, agent):
        watcher_kwargs = get_etcd_connection_settings()
        watcher_kwargs['key_to_poll'] = \
            datamodel_v1.dir_for_host(socket.gethostname()) + "/workload"
        super(CalicoEtcdWatcher, self).__init__(**watcher_kwargs)
        self.agent = agent
        self.suppress_dnsmasq_updates = False

        # Register the etcd paths that we need to watch.
        self.register_path(
            "/calico/v1/host/<hostname>/workload/<orchestrator>" +
            "/<workload_id>/endpoint/<endpoint_id>",
            on_set=self.on_endpoint_set,
            on_del=self.on_endpoint_delete)
        self.register_path(
            "/calico/v1/host/<hostname>/workload/<orchestrator>" +
            "/<workload_id>/endpoint",
            on_del=self.on_dir_delete)
        self.register_path(
            "/calico/v1/host/<hostname>/workload/<orchestrator>" +
            "/<workload_id>",
            on_del=self.on_dir_delete)
        self.register_path(
            "/calico/v1/host/<hostname>/workload/<orchestrator>",
            on_del=self.on_dir_delete)
        self.register_path("/calico/v1/host/<hostname>/workload",
                           on_del=self.on_dir_delete)

        # Networks for which Dnsmasq needs updating.
        self.dirty_networks = set()

        # Subnets that have changed in etcd since when we last read them.
        self.dirty_subnets = set()

        # Also watch the etcd subnet tree.  When something in that subtree
        # changes, the subnet watcher will tell _this_ watcher to resync.
        self.subnet_watcher = SubnetWatcher(self)
        eventlet.spawn(self.subnet_watcher.loop)
 def test_dir_for_host(self):
     self.assertEqual(dir_for_host("foo"), "/calico/v1/host/foo")
 def test_dir_for_host(self):
     self.assertEqual(dir_for_host("foo"), "/calico/v1/host/foo")