summaryrefslogtreecommitdiffstats
path: root/doctor_tests/inspector/congress.py
blob: c89a41bd9186c9cf0511274a32d7eec2026298da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
##############################################################################
# Copyright (c) 2017 ZTE Corporation and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
from doctor_tests.identity_auth import get_identity_auth
from doctor_tests.identity_auth import get_session
from doctor_tests.os_clients import congress_client

from doctor_tests.inspector.base import BaseInspector


class CongressInspector(BaseInspector):
    nova_api_min_version = '2.11'
    doctor_driver = 'doctor'
    doctor_datasource = 'doctor'
    policy = 'classification'
    rules = {
        'host_down':
            'host_down(host) :- doctor:events(hostname=host, type="compute.host.down", status="down")',
        'active_instance_in_host':
            'active_instance_in_host(vmid, host) :- nova:servers(id=vmid, host_name=host, status="ACTIVE")',
        'host_force_down':
            'execute[nova:services.force_down(host, "nova-compute", "True")] :- host_down(host)',
        'error_vm_states':
            'execute[nova:servers.reset_state(vmid, "error")] :- host_down(host), active_instance_in_host(vmid, host)'
    }

    def __init__(self, conf, log):
        super(CongressInspector, self).__init__(conf, log)
        self.auth = get_identity_auth()
        self.congress = congress_client(get_session(auth=self.auth))
        self._init_driver_and_ds()
        self.inspector_url = self.get_inspector_url()

    def _init_driver_and_ds(self):
        datasources = \
            {ds['name']: ds for ds in self.congress.list_datasources()['results']}

        # check nova_api version
        nova_api_version = datasources['nova']['config'].get('api_version')
        if nova_api_version and nova_api_version < self.nova_api_min_version:
            raise Exception('Congress Nova datasource API version < nova_api_min_version(%s)'
                            % self.nova_api_min_version)

        # create doctor datasource if it's not exist
        if self.doctor_datasource not in datasources:
            self.congress.create_datasource(
                body={'driver': self.doctor_driver,
                      'name': self.doctor_datasource})

        # check whether doctor driver exist
        drivers = \
            {driver['id']: driver for driver in self.congress.list_drivers()['results']}
        if self.doctor_driver not in drivers:
            raise Exception('Do not support doctor driver in congress')

        self.policy_rules = \
            {rule['name']: rule for rule in
             self.congress.list_policy_rules(self.policy)['results']}

    def get_inspector_url(self):
        ds = self.congress.list_datasources()['results']
        doctor_ds = next((item for item in ds if item['driver'] == 'doctor'),
                         None)
        congress_endpoint = self.congress.httpclient.get_endpoint(auth=self.auth)
        return ('%s/v1/data-sources/%s/tables/events/rows' %
                (congress_endpoint, doctor_ds['id']))

    def start(self):
        self.log.info('congress inspector start......')

        for rule_name, rule in self.rules.items():
            self._add_rule(rule_name, rule)

    def stop(self):
        self.log.info('congress inspector stop......')

        for rule_name in self.rules.keys():
            self._del_rule(rule_name)

    def _add_rule(self, rule_name, rule):
        if rule_name not in self.policy_rules:
            self.congress.create_policy_rule(self.policy,
                                             body={'name': rule_name,
                                                   'rule': rule})

    def _del_rule(self, rule_name):
        if rule_name in self.policy_rules:
            rule_id = self.policy_rules[rule_name]['id']
            self.congress.delete_policy_rule(self.policy, rule_id)
">long seq; struct rw_semaphore lock; struct cache_set *c; struct btree *parent; struct mutex write_lock; unsigned long flags; uint16_t written; /* would be nice to kill */ uint8_t level; struct btree_keys keys; /* For outstanding btree writes, used as a lock - protects write_idx */ struct closure io; struct semaphore io_mutex; struct list_head list; struct delayed_work work; struct btree_write writes[2]; struct bio *bio; }; #define BTREE_FLAG(flag) \ static inline bool btree_node_ ## flag(struct btree *b) \ { return test_bit(BTREE_NODE_ ## flag, &b->flags); } \ \ static inline void set_btree_node_ ## flag(struct btree *b) \ { set_bit(BTREE_NODE_ ## flag, &b->flags); } \ enum btree_flags { BTREE_NODE_io_error, BTREE_NODE_dirty, BTREE_NODE_write_idx, }; BTREE_FLAG(io_error); BTREE_FLAG(dirty); BTREE_FLAG(write_idx); static inline struct btree_write *btree_current_write(struct btree *b) { return b->writes + btree_node_write_idx(b); } static inline struct btree_write *btree_prev_write(struct btree *b) { return b->writes + (btree_node_write_idx(b) ^ 1); } static inline struct bset *btree_bset_first(struct btree *b) { return b->keys.set->data; } static inline struct bset *btree_bset_last(struct btree *b) { return bset_tree_last(&b->keys)->data; } static inline unsigned bset_block_offset(struct btree *b, struct bset *i) { return bset_sector_offset(&b->keys, i) >> b->c->block_bits; } static inline void set_gc_sectors(struct cache_set *c) { atomic_set(&c->sectors_to_gc, c->sb.bucket_size * c->nbuckets / 16); } void bkey_put(struct cache_set *c, struct bkey *k); /* Looping macros */ #define for_each_cached_btree(b, c, iter) \ for (iter = 0; \ iter < ARRAY_SIZE((c)->bucket_hash); \ iter++) \ hlist_for_each_entry_rcu((b), (c)->bucket_hash + iter, hash) /* Recursing down the btree */ struct btree_op { /* for waiting on btree reserve in btree_split() */ wait_queue_t wait; /* Btree level at which we start taking write locks */ short lock; unsigned insert_collision:1; }; static inline void bch_btree_op_init(struct btree_op *op, int write_lock_level) { memset(op, 0, sizeof(struct btree_op)); init_wait(&op->wait); op->lock = write_lock_level; } static inline void rw_lock(bool w, struct btree *b, int level) { w ? down_write_nested(&b->lock, level + 1) : down_read_nested(&b->lock, level + 1); if (w) b->seq++; } static inline void rw_unlock(bool w, struct btree *b) { if (w) b->seq++; (w ? up_write : up_read)(&b->lock); } void bch_btree_node_read_done(struct btree *); void __bch_btree_node_write(struct btree *, struct closure *); void bch_btree_node_write(struct btree *, struct closure *); void bch_btree_set_root(struct btree *); struct btree *__bch_btree_node_alloc(struct cache_set *, struct btree_op *, int, bool, struct btree *); struct btree *bch_btree_node_get(struct cache_set *, struct btree_op *, struct bkey *, int, bool, struct btree *); int bch_btree_insert_check_key(struct btree *, struct btree_op *, struct bkey *); int bch_btree_insert(struct cache_set *, struct keylist *, atomic_t *, struct bkey *); int bch_gc_thread_start(struct cache_set *); void bch_initial_gc_finish(struct cache_set *); void bch_moving_gc(struct cache_set *); int bch_btree_check(struct cache_set *); void bch_initial_mark_key(struct cache_set *, int, struct bkey *); static inline void wake_up_gc(struct cache_set *c) { if (c->gc_thread) wake_up_process(c->gc_thread); } #define MAP_DONE 0 #define MAP_CONTINUE 1 #define MAP_ALL_NODES 0 #define MAP_LEAF_NODES 1 #define MAP_END_KEY 1 typedef int (btree_map_nodes_fn)(struct btree_op *, struct btree *); int __bch_btree_map_nodes(struct btree_op *, struct cache_set *, struct bkey *, btree_map_nodes_fn *, int); static inline int bch_btree_map_nodes(struct btree_op *op, struct cache_set *c, struct bkey *from, btree_map_nodes_fn *fn) { return __bch_btree_map_nodes(op, c, from, fn, MAP_ALL_NODES); } static inline int bch_btree_map_leaf_nodes(struct btree_op *op, struct cache_set *c, struct bkey *from, btree_map_nodes_fn *fn) { return __bch_btree_map_nodes(op, c, from, fn, MAP_LEAF_NODES); } typedef int (btree_map_keys_fn)(struct btree_op *, struct btree *, struct bkey *); int bch_btree_map_keys(struct btree_op *, struct cache_set *, struct bkey *, btree_map_keys_fn *, int); typedef bool (keybuf_pred_fn)(struct keybuf *, struct bkey *); void bch_keybuf_init(struct keybuf *); void bch_refill_keybuf(struct cache_set *, struct keybuf *, struct bkey *, keybuf_pred_fn *); bool bch_keybuf_check_overlapping(struct keybuf *, struct bkey *, struct bkey *); void bch_keybuf_del(struct keybuf *, struct keybuf_key *); struct keybuf_key *bch_keybuf_next(struct keybuf *); struct keybuf_key *bch_keybuf_next_rescan(struct cache_set *, struct keybuf *, struct bkey *, keybuf_pred_fn *); #endif