]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgwam: more work
authorYehuda Sadeh <yehuda@redhat.com>
Sun, 2 May 2021 14:13:30 +0000 (07:13 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Wed, 24 Nov 2021 20:54:29 +0000 (12:54 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/CMakeLists.txt
src/rgw/rgw_admin_multi.py

index 1dd8e2fc5b4051f5bfa088c9ad1d43591bba6963..5acbd17a2dd07e8369a99a9262c0efd89374685a 100644 (file)
@@ -380,19 +380,6 @@ target_link_libraries(radosgw-admin ${rgw_libs} librados
   ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${BLKID_LIBRARIES})
 install(TARGETS radosgw-admin DESTINATION bin)
 
-set(radosgw_admin_srcs
-  rgw_admin_cli.cc
-  rgw_sync_checkpoint.cc
-  rgw_orphan.cc)
-add_executable(radosgw-admin-cli ${radosgw_admin_srcs})
-target_link_libraries(radosgw-admin-cli ${rgw_libs} librados
-  cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
-  cls_log_client cls_timeindex_client neorados_cls_fifo
-  cls_version_client cls_user_client
-  global ${FCGI_LIBRARY} ${LIB_RESOLV}
-  ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${BLKID_LIBRARIES})
-install(TARGETS radosgw-admin-cli DESTINATION bin)
-
 set(radosgw_es_srcs
   rgw_es_main.cc)
 add_executable(radosgw-es ${radosgw_es_srcs})
index 4e8bb2ee87c41d8ab8523999a8ed61f0c435b134..a4db1d6d0d828c33f1682c0cd27a795da41265a6 100644 (file)
@@ -4,10 +4,80 @@ import string
 import json
 import argparse
 import sys
+import socket
+
+DEFAULT_PORT = 8000
 
 def rand_alphanum_lower(l):
     return ''.join(random.choices(string.ascii_lowercase + string.digits, k=l))
 
+def get_endpoints(endpoints):
+    if endpoints:
+        return endpoints
+
+    hostname = socket.getfqdn()
+
+    return 'http://%s:%d' % (hostname, DEFAULT_PORT)
+
+class JSONObj:
+    def to_json(self):
+        return json.dumps(self, default=lambda o: o.__dict__, indent=4)
+
+class RGWZone(JSONObj):
+    def __init__(self, zone_dict):
+        self.id = zone_dict['id']
+        self.name = zone_dict['name']
+        self.endpoints = zone_dict['endpoints']
+
+class RGWZoneGroup(JSONObj):
+    def __init__(self, zg_dict):
+        self.id = zg_dict['id']
+        self.name = zg_dict['name']
+        self.api_name = zg_dict['api_name']
+        self.is_master = zg_dict['is_master']
+        self.endpoints = zg_dict['endpoints']
+
+        self.zones_by_id = {}
+        self.zones_by_name = {}
+
+        for zone in zg_dict['zones']:
+            self.zones_by_id[zone['id']] = RGWZone(zone)
+            self.zones_by_name[zone['name']] = RGWZone(zone)
+
+class RGWPeriod(JSONObj):
+    def __init__(self, period_dict):
+        self.id = period_dict['id']
+        self.epoch = period_dict['epoch']
+        pm = period_dict['period_map']
+        self.zonegroups_by_id = {}
+        self.zonegroups_by_name = {}
+
+        for zg in pm['zonegroups']:
+            self.zonegroups_by_id[zg['id']] = RGWZoneGroup(zg)
+            self.zonegroups_by_name[zg['name']] = RGWZoneGroup(zg)
+
+class RGWAccessKey(JSONObj):
+    def __init__(self, d):
+        self.uid = d['user']
+        self.access_key = d['access_key']
+        self.secret_key = d['secret_key']
+
+class RGWUser(JSONObj):
+    def __init__(self, d):
+        self.uid = d['user_id']
+        self.display_name = d['display_name']
+        self.email = d['email']
+
+        self.keys = []
+
+        for k in d['keys']:
+            self.keys.append(RGWAccessKey(k))
+
+        is_system = d.get('system') or 'false'
+        self.system = (is_system == 'true')
+
+
+
 class RGWAMException(BaseException):
     def __init__(self, message):
         self.message = message
@@ -46,12 +116,125 @@ class RealmOp(RGWAdminCmd):
 
         return self.info
 
+class ZonegroupOp(RGWAdminCmd):
+    def __init__(self):
+        RGWAdminCmd.__init__(self)
+        
+    def create(self, realm, name = None, endpoints = None, is_master = True, is_default = True):
+        self.name = name
+        if not self.name:
+            self.name = 'zg-' + rand_alphanum_lower(8)
+
+        params = [ 'zonegroup',
+                   'create',
+                   '--rgw-realm', realm,
+                   '--rgw-zonegroup', self.name,
+                   '--endpoints', endpoints ]
+
+        if is_master:
+            params += [ '--master' ]
+
+        if is_default:
+            params += [ '--default' ]
+
+        retcode, stdout = RGWAdminCmd.run(self, params)
+        if retcode != 0:
+            return None
+
+        self.info = json.loads(stdout)
+
+        return self.info
+
+class ZoneOp(RGWAdminCmd):
+    def __init__(self):
+        RGWAdminCmd.__init__(self)
+        
+    def create(self, realm, zonegroup, name = None, endpoints = None, is_master = True, is_default = True):
+        self.name = name
+        if not self.name:
+            self.name = 'zg-' + rand_alphanum_lower(8)
+
+        params = [ 'zone',
+                   'create',
+                   '--rgw-realm', realm,
+                   '--rgw-zonegroup', zonegroup,
+                   '--rgw-zone', self.name,
+                   '--endpoints', endpoints ]
+
+        if is_master:
+            params += [ '--master' ]
+
+        if is_default:
+            params += [ '--default' ]
+
+        retcode, stdout = RGWAdminCmd.run(self, params)
+        if retcode != 0:
+            return None
+
+        self.info = json.loads(stdout)
+
+        return self.info
+
+class PeriodOp(RGWAdminCmd):
+    def __init__(self):
+        RGWAdminCmd.__init__(self)
+        
+    def update(self, realm, commit = True):
+
+        params = [ 'period',
+                   'update',
+                   '--rgw-realm', realm ]
+
+        if commit:
+            params += [ '--commit' ]
+
+        retcode, stdout = RGWAdminCmd.run(self, params)
+        if retcode != 0:
+            return None
+
+        self.info = json.loads(stdout)
+
+        return self.info
+
+class UserOp(RGWAdminCmd):
+    def __init__(self):
+        RGWAdminCmd.__init__(self)
+        
+    def create(self, uid = None, display_name = None, email = None, is_system = False):
+        self.uid = uid
+        if not self.uid:
+            self.uid = 'uid-' + rand_alphanum_lower(6)
+
+        self.display_name = display_name
+        if not self.display_name:
+            self.display_name = self.uid
+
+        params = [ 'user',
+                   'create',
+                   '--uid', self.uid,
+                   '--display-name', self.display_name ]
+
+        if email:
+            params += [ '--email', email ]
+
+        if is_system:
+            params += [ '--system' ]
+
+        retcode, stdout = RGWAdminCmd.run(self, params)
+        if retcode != 0:
+            return None
+
+        self.info = json.loads(stdout)
+
+        return self.info
 
 class RGWAM:
     def __init__(self):
         pass
 
     def realm_bootstrap(self, realm, zonegroup, zone, endpoints):
+        endpoints = get_endpoints(endpoints)
+
         realm_info = RealmOp().create(realm)
         if not realm_info:
             return
@@ -60,16 +243,34 @@ class RGWAM:
         realm_id = realm_info['id']
         print('Created realm %s (%s)' % (realm_name, realm_id))
 
-    def zonegroup_create(self, realm, zonegroup, zone, endpoints):
-        realm_op = RealmOp()
+        zg_info = ZonegroupOp().create(realm_name, zonegroup, endpoints, True, True)
+
+        zg_name = zg_info['name']
+        zg_id = zg_info['id']
+        print('Created zonegroup %s (%s)' % (zg_name, zg_id))
+
+        zone_info = ZoneOp().create(realm_name, zg_name, zone, endpoints, True, True)
+
+        zone_name = zone_info['name']
+        zone_id = zone_info['id']
+        print('Created zone %s (%s)' % (zone_name, zone_id))
+
+        period_info = PeriodOp().update(realm_name, True)
+
+        period = RGWPeriod(period_info)
+
+        print('Period: ' + period.id)
+
+        user_info = UserOp().create(is_system = True)
+
+        user = RGWUser(user_info)
+
+        print('Created system user: %s' % user.uid)
+
+
+
 
-        realm_info = realm_op.create(realm)
-        if not realm_info:
-            return
 
-        realm_name = realm_info['name']
-        realm_id = realm_info['id']
-        print('Created realm %s (%s)' % (realm_name, realm_id))
 
 
 class RealmCommand: