]>
Commit | Line | Data |
---|---|---|
20effc67 TL |
1 | import json |
2 | ||
3 | from abc import abstractmethod | |
4 | ||
5 | ||
6 | class RGWAMException(Exception): | |
7 | def __init__(self, message, orig=None): | |
8 | if orig: | |
9 | self.message = message + ': ' + orig.message | |
10 | self.retcode = orig.retcode | |
11 | self.stdout = orig.stdout | |
12 | self.stderr = orig.stdout | |
13 | else: | |
14 | self.message = message | |
15 | self.retcode = 0 | |
16 | self.stdout = None | |
17 | self.stderr = None | |
18 | ||
19 | ||
20 | class RGWAMCmdRunException(RGWAMException): | |
21 | def __init__(self, cmd, retcode, stdout, stderr): | |
22 | super().__init__('Command error (%d): %s\nstdout:%s\nstderr:%s' % | |
23 | (retcode, cmd, stdout, stderr)) | |
24 | self.retcode = retcode | |
25 | self.stdout = stdout | |
26 | self.stderr = stderr | |
27 | ||
28 | ||
29 | class RGWAMEnvMgr: | |
30 | @abstractmethod | |
31 | def tool_exec(self, prog, args): | |
32 | pass | |
33 | ||
34 | @abstractmethod | |
35 | def apply_rgw(self, svc_id, realm_name, zone_name, port=None): | |
36 | pass | |
37 | ||
38 | @abstractmethod | |
39 | def list_daemons(self, service_name, daemon_type=None, daemon_id=None, hostname=None, | |
40 | refresh=True): | |
41 | pass | |
42 | ||
43 | ||
44 | class JSONObj: | |
45 | def to_json(self): | |
46 | return json.dumps(self, default=lambda o: o.__dict__, indent=4) | |
47 | ||
48 | ||
49 | class RealmToken(JSONObj): | |
50 | def __init__(self, realm_id, endpoint, uid, access_key, secret): | |
51 | self.realm_id = realm_id | |
52 | self.endpoint = endpoint | |
53 | self.uid = uid | |
54 | self.access_key = access_key | |
55 | self.secret = secret | |
56 | ||
57 | ||
58 | class RGWZone(JSONObj): | |
59 | def __init__(self, zone_dict): | |
60 | self.id = zone_dict['id'] | |
61 | self.name = zone_dict['name'] | |
62 | self.endpoints = zone_dict['endpoints'] | |
63 | ||
64 | ||
65 | class RGWZoneGroup(JSONObj): | |
66 | def __init__(self, zg_dict): | |
67 | self.id = zg_dict['id'] | |
68 | self.name = zg_dict['name'] | |
69 | self.api_name = zg_dict['api_name'] | |
70 | self.is_master = zg_dict['is_master'] | |
71 | self.endpoints = zg_dict['endpoints'] | |
72 | ||
73 | self.zones_by_id = {} | |
74 | self.zones_by_name = {} | |
75 | self.all_endpoints = [] | |
76 | ||
77 | for zone in zg_dict['zones']: | |
78 | z = RGWZone(zone) | |
79 | self.zones_by_id[zone['id']] = z | |
80 | self.zones_by_name[zone['name']] = z | |
81 | self.all_endpoints += z.endpoints | |
82 | ||
83 | def endpoint_exists(self, endpoint): | |
84 | for ep in self.all_endpoints: | |
85 | if ep == endpoint: | |
86 | return True | |
87 | return False | |
88 | ||
89 | def get_zone_endpoints(self, zone_id): | |
90 | z = self.zones_by_id.get(zone_id) | |
91 | if not z: | |
92 | return None | |
93 | ||
94 | return z.endpoints | |
95 | ||
96 | def iter_zones(self): | |
97 | for zone in self.zones_by_id.values(): | |
98 | yield zone | |
99 | ||
100 | ||
101 | class RGWPeriod(JSONObj): | |
102 | def __init__(self, period_dict): | |
103 | self.id = period_dict['id'] | |
104 | self.epoch = period_dict['epoch'] | |
105 | self.master_zone = period_dict['master_zone'] | |
106 | self.master_zonegroup = period_dict['master_zonegroup'] | |
107 | self.realm_name = period_dict['realm_name'] | |
108 | self.realm_id = period_dict['realm_id'] | |
109 | pm = period_dict['period_map'] | |
110 | self.zonegroups_by_id = {} | |
111 | self.zonegroups_by_name = {} | |
112 | ||
113 | for zg in pm['zonegroups']: | |
114 | self.zonegroups_by_id[zg['id']] = RGWZoneGroup(zg) | |
115 | self.zonegroups_by_name[zg['name']] = RGWZoneGroup(zg) | |
116 | ||
117 | def endpoint_exists(self, endpoint): | |
118 | for _, zg in self.zonegroups_by_id.items(): | |
119 | if zg.endpoint_exists(endpoint): | |
120 | return True | |
121 | return False | |
122 | ||
123 | def find_zonegroup_by_name(self, zonegroup): | |
124 | if not zonegroup: | |
125 | return self.find_zonegroup_by_id(self.master_zonegroup) | |
126 | return self.zonegroups_by_name.get(zonegroup) | |
127 | ||
128 | def find_zonegroup_by_id(self, zonegroup): | |
129 | return self.zonegroups_by_id.get(zonegroup) | |
130 | ||
131 | def get_zone_endpoints(self, zonegroup_id, zone_id): | |
132 | zg = self.zonegroups_by_id.get(zonegroup_id) | |
133 | if not zg: | |
134 | return None | |
135 | ||
136 | return zg.get_zone_endpoints(zone_id) | |
137 | ||
138 | def iter_zonegroups(self): | |
139 | for zg in self.zonegroups_by_id.values(): | |
140 | yield zg | |
141 | ||
142 | ||
143 | class RGWAccessKey(JSONObj): | |
144 | def __init__(self, d): | |
145 | self.uid = d['user'] | |
146 | self.access_key = d['access_key'] | |
147 | self.secret_key = d['secret_key'] | |
148 | ||
149 | ||
150 | class RGWUser(JSONObj): | |
151 | def __init__(self, d): | |
152 | self.uid = d['user_id'] | |
153 | self.display_name = d['display_name'] | |
154 | self.email = d['email'] | |
155 | ||
156 | self.keys = [] | |
157 | ||
158 | for k in d['keys']: | |
159 | self.keys.append(RGWAccessKey(k)) | |
160 | ||
161 | is_system = d.get('system') or 'false' | |
162 | self.system = (is_system == 'true') |