--- /dev/null
+import logging
+
+import boto
+import boto.s3.connection
+
+from rgw_multi.multisite import *
+from rgw_multi.tests import *
+from rgw_multi.zone_pubsub import *
+
+log = logging.getLogger(__name__)
+
+# check if at least one pubsub zone exist
+def check_ps_configured():
+ realm = get_realm()
+ zonegroup = realm.master_zonegroup()
+
+ es_zones = zonegroup.zones_by_type.get("pubsub")
+ if not es_zones:
+ raise SkipTest("Requires at least one PS zone")
+
+# check if a specific zone is pubsub zone
+def is_ps_zone(zone_conn):
+ if not zone_conn:
+ return False
+ return zone_conn.zone.tier_type() == "pubsub"
+
+# initialize the environment
+def init_env():
+ check_ps_configured()
+
+ realm = get_realm()
+ zonegroup = realm.master_zonegroup()
+ zonegroup_conns = ZonegroupConns(zonegroup)
+
+ zonegroup_meta_checkpoint(zonegroup)
+
+ for conn in zonegroup_conns.zones:
+ if is_ps_zone(conn):
+ zone_meta_checkpoint(conn.zone)
+
+# test basic sync
+def test_ps_sync():
+ init_env()
+
--- /dev/null
+import json
+import requests.compat
+import logging
+
+import boto
+import boto.s3.connection
+
+import dateutil.parser
+
+from .multisite import *
+from .tools import *
+
+log = logging.getLogger(__name__)
+
+class PSZone(Zone):
+ def __init__(self, name, zonegroup = None, cluster = None, data = None, zone_id = None, gateways = None):
+ super(PSZone, self).__init__(name, zonegroup, cluster, data, zone_id, gateways)
+
+ def is_read_only(self):
+ return True
+
+ def tier_type(self):
+ return "pubsub"
+
+ def create(self, cluster, args = None, check_retcode = True):
+ """ create the object with the given arguments """
+
+ if args is None:
+ args = ''
+
+ args += [ '--tier-type', self.tier_type() ]
+
+ return self.json_command(cluster, 'create', args, check_retcode=check_retcode)
+
+ def has_buckets(self):
+ return False
+
+ class Conn(ZoneConn):
+ def __init__(self, zone, credentials):
+ super(PSZone.Conn, self).__init__(zone, credentials)
+
+ def get_conn(self, credentials):
+ return self.Conn(self, credentials)
+
from rgw_multi.zone_es import ESZoneConfig as ESZoneConfig
from rgw_multi.zone_cloud import CloudZone as CloudZone
from rgw_multi.zone_cloud import CloudZoneConfig as CloudZoneConfig
+from rgw_multi.zone_pubsub import PSZone as PSZone
# make tests from rgw_multi.tests available to nose
from rgw_multi.tests import *
from rgw_multi.tests_es import *
+from rgw_multi.tests_ps import *
mstart_path = os.getenv('MSTART_PATH')
if mstart_path is None:
cfg = configparser.RawConfigParser({
'num_zonegroups': 1,
'num_zones': 3,
+ 'num_ps_zones': 0,
'num_es_zones': 0,
'num_cloud_zones': 0,
'gateways_per_zone': 2,
parser.add_argument('--checkpoint-retries', type=int, default=cfg.getint(section, 'checkpoint_retries'))
parser.add_argument('--checkpoint-delay', type=int, default=cfg.getint(section, 'checkpoint_delay'))
parser.add_argument('--reconfigure-delay', type=int, default=cfg.getint(section, 'reconfigure_delay'))
+ parser.add_argument('--num-ps-zones', type=int, default=cfg.getint(section, 'num_ps_zones'))
es_cfg = []
cloud_cfg = []
num_es_zones = len(es_cfg)
num_cloud_zones = len(cloud_cfg)
- num_zones = args.num_zones + num_es_zones + num_cloud_zones
+ num_zones = args.num_zones + num_es_zones + num_cloud_zones + args.num_ps_zones
for zg in range(0, args.num_zonegroups):
zonegroup = multisite.ZoneGroup(zonegroup_name(zg), period)
zonegroup.get(cluster)
es_zone = (z >= args.num_zones and z < args.num_zones + num_es_zones)
- cloud_zone = (z >= args.num_zones + num_es_zones)
+ cloud_zone = (z >= args.num_zones + num_es_zones and z < args.num_zones + num_es_zones + num_cloud_zones)
+ ps_zone = (z >= args.num_zones + num_es_zones + num_cloud_zones)
# create the zone in its zonegroup
zone = multisite.Zone(zone_name(zg, z), zonegroup, cluster)
ccfg = cloud_cfg[zone_index]
zone = CloudZone(zone_name(zg, z), ccfg.endpoint, ccfg.credentials, ccfg.source_bucket,
ccfg.target_path, zonegroup, cluster)
+ elif ps_zone:
+ zone_index = z - args.num_zones - num_es_zones - num_cloud_zones
+ zone = PSZone(zone_name(zg, z), zonegroup, cluster)
else:
zone = RadosZone(zone_name(zg, z), zonegroup, cluster)
if __name__ == "__main__":
init(True)
+