Commit dc522d6c authored by Leigh Stoller's avatar Leigh Stoller

Update to reflect recent change to osids and imageids now being

globally unique IDs. dump-descriptors.in is a lot uglier, but
load-descriptors.in is still reasonable.
parent a0e2535a
insert into temp_images set creator='elabman',default_osid='emulab-ops-FBSD410-STD',part4_osid=NULL,loadpart='0',shared='0',load_address='',imagename='FBSD410+RHL90-STD',pid='emulab-ops',ezid='0',updated=NULL,loadlength='4',imageid='emulab-ops-FBSD410+RHL90-STD',magic=NULL,global='1',part1_osid='emulab-ops-FBSD410-STD',path='/usr/testbed/images/FBSD410+RHL90-STD.ndz',frisbee_pid='0',description='FreeBSD 4.10 and RedHat 9.0',load_busy='0',part3_osid=NULL,created='2007-03-07 14:10:25',gid='emulab-ops',part2_osid='emulab-ops-RHL90-STD';
insert into temp_images set creator='elabman',default_osid='emulab-ops-FBSD410-STD',part4_osid=NULL,loadpart='1',shared='0',load_address='',imagename='FBSD410-STD',pid='emulab-ops',ezid='1',updated=NULL,loadlength='1',imageid='emulab-ops-FBSD410-STD',magic=NULL,global='1',part1_osid='emulab-ops-FBSD410-STD',path='/usr/testbed/images/FBSD410-STD.ndz',frisbee_pid='0',description='Testbed version of FreeBSD 4.10',load_busy='0',part3_osid=NULL,created='2007-03-07 14:10:25',gid='emulab-ops',part2_osid=NULL;
insert into temp_images set creator='elabman',default_osid='emulab-ops-RHL90-STD',part4_osid=NULL,loadpart='2',shared='0',load_address='',imagename='RHL90-STD',pid='emulab-ops',ezid='0',updated=NULL,loadlength='1',imageid='emulab-ops-RHL90-STD',magic=NULL,global='1',part1_osid=NULL,path='/usr/testbed/images/RHL90-STD.ndz',frisbee_pid='0',description='Redhat 9.0 slice disk image',load_busy='0',part3_osid=NULL,created='2007-03-07 14:10:25',gid='emulab-ops',part2_osid='emulab-ops-RHL90-STD';
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='emulab-ops-FBSD-JAIL',reboot_waittime='90',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='FBSD-JAIL',OS='FreeBSD',magic='',version='4.X',machinetype='',path=NULL,osfeatures='ping,ssh,isup,linktest',description='Generic OSID for jailed nodes',created='2007-03-07 14:10:25',op_mode='PCVM',nextosid='FBSD-STD';
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='emulab-ops-FBSD410-STD',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='1',osname='FBSD410-STD',OS='FreeBSD',magic=NULL,version='4.10',machinetype='',path=NULL,osfeatures='ping,ssh,ipod,isup,veths,mlinks,linktest,linkdelays',description='Testbed version of FreeBSD 4.10',created='2007-03-07 14:10:25',op_mode='NORMALv2',nextosid=NULL;
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='emulab-ops-POWER-CONTROLLER',reboot_waittime='60',mustclean='1',shared='0',pid='emulab-ops',ezid='0',osname='POWER-CONTROLLER',OS='Other',magic='',version='0.00',machinetype='',path=NULL,osfeatures='',description='Stub descriptor for power controllers of any kind',created='2007-03-07 14:10:25',op_mode='ALWAYSUP',nextosid=NULL;
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='emulab-ops-RHL90-STD',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='0',osname='RHL90-STD',OS='Linux',magic='',version='9.0',machinetype='',path=NULL,osfeatures='ping,ssh,ipod,isup,linktest,linkdelays',description='Testbed version of RedHat Linux 9.0',created='2007-03-07 14:10:25',op_mode='NORMALv2',nextosid=NULL;
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='FBSD-STD',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='0',osname='FBSD-STD',OS='FreeBSD',magic='FreeBSD',version='',machinetype='pc600',path=NULL,osfeatures='ping,ssh,ipod,isup,veths,mlinks,linktest,linkdelays',description='Any Version of FreeBSD',created='2007-03-07 14:10:25',op_mode='NORMAL',nextosid='emulab-ops-FBSD410-STD';
insert into temp_os_info set mfs='1',creator='elabman',max_concurrent=NULL,osid='FREEBSD-MFS',reboot_waittime='150',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='FREEBSD-MFS',OS='FreeBSD',magic=NULL,version='4.5',machinetype='',path='/tftpboot/freebsd',osfeatures='ping,ssh,ipod,isup',description='FreeBSD in an MFS',created='2007-03-07 14:10:25',op_mode='PXEFBSD',nextosid=NULL;
insert into temp_os_info set mfs='1',creator='elabman',max_concurrent=NULL,osid='FRISBEE-MFS',reboot_waittime='150',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='FRISBEE-MFS',OS='FreeBSD',magic=NULL,version='4.5',machinetype='',path='/tftpboot/frisbee',osfeatures='ping,ssh,ipod,isup',description='Frisbee (FreeBSD) in an MFS',created='2007-03-07 14:10:25',op_mode='RELOAD',nextosid=NULL;
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='FW-IPFW',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='0',osname='FW-IPFW',OS='FreeBSD',magic='FreeBSD',version='',machinetype='',path=NULL,osfeatures='ping,ssh,ipod,isup,veths,mlinks',description='IPFW Firewall',created='2007-03-07 14:10:25',op_mode='NORMAL',nextosid='emulab-ops-FBSD410-STD';
insert into temp_os_info set mfs='1',creator='elabman',max_concurrent=NULL,osid='NEWNODE-MFS',reboot_waittime='150',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='NEWNODE-MFS',OS='FreeBSD',magic=NULL,version='4.5',machinetype='',path='/tftpboot/freebsd.newnode',osfeatures='ping,ssh,ipod,isup',description='NewNode (FreeBSD) in an MFS',created='2007-03-07 14:10:25',op_mode='PXEFBSD',nextosid=NULL;
insert into temp_os_info set mfs='1',creator='elabman',max_concurrent=NULL,osid='OPSNODE-BSD',reboot_waittime='150',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='OPSNODE-BSD',OS='FreeBSD',magic=NULL,version='4.X',machinetype='',path='',osfeatures='ping,ssh,ipod,isup',description='FreeBSD on the Operations Node',created='2007-03-07 14:10:25',op_mode='OPSNODEBSD',nextosid=NULL;
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='RHL-STD',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='0',osname='RHL-STD',OS='Linux',magic='Linux',version='',machinetype='pc600',path=NULL,osfeatures='ping,ssh,ipod,isup,linktest,linkdelays',description='Any of RedHat Linux',created='2007-03-07 14:10:25',op_mode='NORMAL',nextosid='emulab-ops-RHL90-STD';
insert into temp_images set creator='elabman',default_osid='285',part4_osid=NULL,loadpart='0',shared='0',load_address='',imagename='FBSD410+RHL90-STD',pid='emulab-ops',ezid='0',updated=NULL,loadlength='4',imageid='864',magic=NULL,global='1',part1_osid='285',path='/usr/testbed/images/FBSD410+RHL90-STD.ndz',frisbee_pid='0',description='FreeBSD 4.10 and RedHat 9.0',load_busy='0',part3_osid=NULL,created='2007-03-13 11:47:10',old_imageid='emulab-ops-FBSD410+RHL90-STD',gid='emulab-ops',part2_osid='336';
insert into temp_images set creator='elabman',default_osid='285',part4_osid=NULL,loadpart='1',shared='0',load_address='',imagename='FBSD410-STD',pid='emulab-ops',ezid='1',updated=NULL,loadlength='1',imageid='285',magic=NULL,global='1',part1_osid='285',path='/usr/testbed/images/FBSD410-STD.ndz',frisbee_pid='0',description='Testbed version of FreeBSD 4.10',load_busy='0',part3_osid=NULL,created='2007-03-13 11:47:10',old_imageid='emulab-ops-FBSD410-STD',gid='emulab-ops',part2_osid=NULL;
insert into temp_images set creator='elabman',default_osid='336',part4_osid=NULL,loadpart='2',shared='0',load_address='',imagename='RHL90-STD',pid='emulab-ops',ezid='0',updated=NULL,loadlength='1',imageid='865',magic=NULL,global='1',part1_osid=NULL,path='/usr/testbed/images/RHL90-STD.ndz',frisbee_pid='0',description='Redhat 9.0 slice disk image',load_busy='0',part3_osid=NULL,created='2007-03-13 11:47:10',old_imageid='emulab-ops-RHL90-STD',gid='emulab-ops',part2_osid='336';
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='278',reboot_waittime='90',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='FBSD-JAIL',old_osid='emulab-ops-FBSD-JAIL',OS='FreeBSD',magic='',old_nextosid='FBSD-STD',version='4.X',machinetype='',path=NULL,osfeatures='ping,ssh,isup,linktest',description='Generic OSID for jailed nodes',op_mode='PCVM',created='2007-03-13 11:47:10',nextosid='362';
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='362',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='0',osname='FBSD-STD',old_osid='FBSD-STD',OS='FreeBSD',magic='FreeBSD',old_nextosid='MAP:osid_map',version='',machinetype='pc600',path=NULL,osfeatures='ping,ssh,ipod,isup,veths,mlinks,linktest,linkdelays',description='Any Version of FreeBSD',op_mode='NORMAL',created='2007-03-13 11:47:10',nextosid='285';
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='285',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='1',osname='FBSD410-STD',old_osid='emulab-ops-FBSD410-STD',OS='FreeBSD',magic=NULL,old_nextosid='',version='4.10',machinetype='',path=NULL,osfeatures='ping,ssh,ipod,isup,veths,mlinks,linktest,linkdelays',description='Testbed version of FreeBSD 4.10',op_mode='NORMALv2',created='2007-03-13 11:47:10',nextosid=NULL;
insert into temp_os_info set mfs='1',creator='elabman',max_concurrent=NULL,osid='399',reboot_waittime='150',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='FREEBSD-MFS',old_osid='FREEBSD-MFS',OS='FreeBSD',magic=NULL,old_nextosid='',version='4.5',machinetype='',path='/tftpboot/freebsd',osfeatures='ping,ssh,ipod,isup',description='FreeBSD in an MFS',op_mode='PXEFBSD',created='2007-03-13 11:47:10',nextosid=NULL;
insert into temp_os_info set mfs='1',creator='elabman',max_concurrent=NULL,osid='403',reboot_waittime='150',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='FRISBEE-MFS',old_osid='FRISBEE-MFS',OS='FreeBSD',magic=NULL,old_nextosid='',version='4.5',machinetype='',path='/tftpboot/frisbee',osfeatures='ping,ssh,ipod,isup',description='Frisbee (FreeBSD) in an MFS',op_mode='RELOAD',created='2007-03-13 11:47:10',nextosid=NULL;
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='406',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='0',osname='FW-IPFW',old_osid='FW-IPFW',OS='FreeBSD',magic='FreeBSD',old_nextosid='emulab-ops-FBSD410-STD',version='',machinetype='',path=NULL,osfeatures='ping,ssh,ipod,isup,veths,mlinks',description='IPFW Firewall',op_mode='NORMAL',created='2007-03-13 11:47:10',nextosid='285';
insert into temp_os_info set mfs='1',creator='elabman',max_concurrent=NULL,osid='467',reboot_waittime='150',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='NEWNODE-MFS',old_osid='NEWNODE-MFS',OS='FreeBSD',magic=NULL,old_nextosid='',version='4.5',machinetype='',path='/tftpboot/freebsd.newnode',osfeatures='ping,ssh,ipod,isup',description='NewNode (FreeBSD) in an MFS',op_mode='PXEFBSD',created='2007-03-13 11:47:10',nextosid=NULL;
insert into temp_os_info set mfs='1',creator='elabman',max_concurrent=NULL,osid='470',reboot_waittime='150',mustclean='0',shared='1',pid='emulab-ops',ezid='0',osname='OPSNODE-BSD',old_osid='OPSNODE-BSD',OS='FreeBSD',magic=NULL,old_nextosid='',version='4.X',machinetype='',path='',osfeatures='ping,ssh,ipod,isup',description='FreeBSD on the Operations Node',op_mode='OPSNODEBSD',created='2007-03-13 11:47:10',nextosid=NULL;
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='324',reboot_waittime='60',mustclean='1',shared='0',pid='emulab-ops',ezid='0',osname='POWER-CONTROLLER',old_osid='emulab-ops-POWER-CONTROLLER',OS='Other',magic='',old_nextosid='',version='0.00',machinetype='',path=NULL,osfeatures='',description='Stub descriptor for power controllers of any kind',op_mode='ALWAYSUP',created='2007-03-13 11:47:10',nextosid=NULL;
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='526',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='0',osname='RHL-STD',old_osid='RHL-STD',OS='Linux',magic='Linux',old_nextosid='MAP:osid_map',version='',machinetype='pc600',path=NULL,osfeatures='ping,ssh,ipod,isup,linktest,linkdelays',description='Any of RedHat Linux',op_mode='NORMAL',created='2007-03-13 11:47:10',nextosid='336';
insert into temp_os_info set mfs='0',creator='elabman',max_concurrent=NULL,osid='336',reboot_waittime='150',mustclean='1',shared='1',pid='emulab-ops',ezid='0',osname='RHL90-STD',old_osid='emulab-ops-RHL90-STD',OS='Linux',magic='',old_nextosid='',version='9.0',machinetype='',path=NULL,osfeatures='ping,ssh,ipod,isup,linktest,linkdelays',description='Testbed version of RedHat Linux 9.0',op_mode='NORMALv2',created='2007-03-13 11:47:10',nextosid=NULL;
......@@ -22,19 +22,25 @@ sub usage()
#
# These are the images/osids we dump out. We of course get the embedded osids.
# We should probably add an export flag to the tables so we can avoid this
# hardwired list.
# hardwired list. Note that all of these are assumed to live in the emulab-ops
# project.
#
my @images = ('emulab-ops-FBSD410+RHL90-STD',
'emulab-ops-FBSD410-STD',
'emulab-ops-RHL90-STD');
my @imagenames = ('FBSD410+RHL90-STD',
'FBSD410-STD',
'RHL90-STD');
my @osids = ('FREEBSD-MFS', 'FRISBEE-MFS', 'NEWNODE-MFS',
my @osnames = ('FREEBSD-MFS', 'FRISBEE-MFS', 'NEWNODE-MFS',
'OPSNODE-BSD', 'FW-IPFW',
'RHL-STD', 'FBSD-STD',
'emulab-ops-FBSD-JAIL', 'emulab-ops-POWER-CONTROLLER');
'RHL-STD', 'FBSD-STD', 'FBSD-JAIL', 'POWER-CONTROLLER');
my %osidtoimageid = ("RHL-STD" => "emulab-ops-RHL90-STD",
"FBSD-STD" => "emulab-ops-FBSD410-STD");
my @osids = ();
#
# Need to map these dynamically since we do not want to hardwire the actual
# nextosid IDs (numbers) into this table.
#
my %mappings = ("RHL-STD" => "RHL90-STD",
"FBSD-STD" => "FBSD410-STD");
#
# Configure variables
......@@ -90,8 +96,8 @@ open(OUTPUT, ">$filename") or
#
DBQueryFatal("create temporary table temp_images like images");
DBQueryFatal("insert into temp_images ".
"select * from images where ".
join(" or ", map("imageid='$_'", @images)));
"select * from images where pid='$protoproj' and (".
join(" or ", map("imagename='$_'", @imagenames)) . ")");
my $query_result = DBQueryFatal("show create table temp_images");
my $create_string = ($query_result->fetchrow_array())[1];
......@@ -155,8 +161,9 @@ foreach my $key (keys(%tempkeys)) {
#
DBQueryFatal("create temporary table temp_os_info like os_info");
DBQueryFatal("insert into temp_os_info ".
"select * from os_info where ".
join(" or ", map("osid='$_'", @osids)));
"select * from os_info where pid='$protoproj' and ((".
join(" or ", map("osname='$_'", @osnames)) . ") or (".
join(" or ", map("osid='$_'", @osids)) . "))");
$query_result = DBQueryFatal("show create table temp_os_info");
$create_string = ($query_result->fetchrow_array())[1];
......@@ -179,11 +186,20 @@ DBQueryFatal("update temp_os_info set ".
# We reset the nextosid slots in the -STD osids, rather then worrying
# about the osid_map table.
#
foreach my $osid (keys(%osidtoimageid)) {
my $nextosid = $osidtoimageid{$osid};
foreach my $osname (keys(%mappings)) {
my $nextosname = $mappings{$osname};
$query_result =
DBQueryFatal("select osid from temp_os_info ".
"where pid='$protoproj' and osname='$nextosname'");
if (! $query_result->numrows) {
print "Could not map $protoproj,$osname to its osid!\n";
exit(-1);
}
my ($nextosid) = $query_result->fetchrow_array();
DBQueryFatal("update temp_os_info set nextosid='$nextosid' ".
"where osid='$osid'");
"where pid='$protoproj' and osname='$osname'");
}
$query_result =
......
......@@ -22,7 +22,7 @@ sub usage()
# These are the OSIDs that are used to populate the osidtoimageid table
# using their nextosid entries.
#
my @standard_osids = ('RHL-STD', 'FBSD-STD');
my @standard_osnames = ('RHL-STD', 'FBSD-STD');
#
# Configure variables
......@@ -45,7 +45,9 @@ use Project;
#$libdb::DBQUERY_DEBUG = 1;
# Local
my %osidtoimageid = ();
my %osidtoimageid = ();
my %local_osids = ();
my %local_imageids = ();
#
# Turn off line buffering on output
......@@ -86,8 +88,9 @@ my $gid = $protoproj->gid();
my $gid_idx = $protoproj->gid_idx();
# Temp tables to hold new rows.
DBQueryFatal("create temporary table temp_images like images");
DBQueryFatal("create temporary table temp_os_info like os_info");
DBQueryFatal("create table temp_images like images");
DBQueryFatal("create table temp_os_info like os_info");
DBQueryFatal("create table temp_o2i like osidtoimageid");
#
# Open tempfile.
......@@ -135,21 +138,91 @@ while (my $rowref = $describe_result->fetchrow_hashref()) {
}
}
#
# Go through the new set of os_info entries and assign local IDs to them.
# Remember them since we need to change the new images table too.
#
my $query_result = DBQueryFatal("select osid from temp_os_info");
while (my ($osid) = $query_result->fetchrow_array()) {
$local_osids{$osid} = TBGetUniqueIndex("next_osid", 1000);
}
#
# Update temp_os_info with locally derived osids. nextosid as well.
#
$query_result->dataseek(0);
while (my ($osid) = $query_result->fetchrow_array()) {
my $newosid = $local_osids{$osid};
DBQueryFatal("update temp_os_info set osid='$newosid' ".
"where osid='$osid'");
DBQueryFatal("update temp_os_info set nextosid='$newosid' ".
"where nextosid='$osid'");
}
#
# Go through new set of images entries, but watch for ezid images since they
# have the same ID as its corresponding os_info entry.
#
$query_result = DBQueryFatal("select imageid,ezid from temp_images");
while (my ($imageid,$ezid) = $query_result->fetchrow_array()) {
if ($ezid) {
$local_imageids{$imageid} = $local_osids{$imageid};
}
else {
$local_imageids{$imageid} = TBGetUniqueIndex("next_osid", 1000);
}
}
#
# Update temp_images with locally derived imageids.
#
$query_result->dataseek(0);
while (my ($imageid) = $query_result->fetchrow_array()) {
my $newimageid = $local_imageids{$imageid};
DBQueryFatal("update temp_images set imageid='$newimageid' ".
"where imageid='$imageid'");
}
#
# And then update osids inside temp_images with locally derived imageids.
#
foreach my $osid (keys(%local_osids)) {
my $newosid = $local_osids{$osid};
DBQueryFatal("update temp_images set part1_osid='$newosid' ".
"where part1_osid='$osid'");
DBQueryFatal("update temp_images set part2_osid='$newosid' ".
"where part2_osid='$osid'");
DBQueryFatal("update temp_images set part3_osid='$newosid' ".
"where part3_osid='$osid'");
DBQueryFatal("update temp_images set part4_osid='$newosid' ".
"where part4_osid='$osid'");
DBQueryFatal("update temp_images set default_osid='$newosid' ".
"where default_osid='$osid'");
}
#
# Use the nextosid slot of the -STD osids to figure out what the default
# images are.
#
my $query_result =
$query_result =
DBQueryFatal("select nextosid from temp_os_info ".
"where nextosid is not null and (".
join(" or ", map("osid='$_'", @standard_osids)) . ")");
join(" or ", map("osname='$_'", @standard_osnames)) . ")");
while (my ($nextosid) = $query_result->fetchrow_array()) {
my $subquery_result =
DBQueryFatal("select imageid from temp_images where ".
DBQueryFatal("select imageid from temp_images ".
"where loadlength=1 and (".
join(" or ", map("$_='$nextosid'",
("part1_osid", "part2_osid",
"part3_osid", "part4_osid"))));
"part3_osid", "part4_osid"))) . ")");
if (!$subquery_result->numrows) {
print "*** WARNING: No osidtoimageid mapping for $nextosid\n";
......@@ -160,13 +233,6 @@ while (my ($nextosid) = $query_result->fetchrow_array()) {
$osidtoimageid{$nextosid} = $imageid;
}
#
# Ready to populate the tables. Move the entries from temp_images and
# temp_os_info across to the real tables.
#
DBQueryFatal("replace into images select * from temp_images");
DBQueryFatal("replace into os_info select * from temp_os_info");
#
# Make up osidtoimageid entries for all local PCs. This is a shotgun
# approach, but for a new testbed is probably the right thing.
......@@ -178,11 +244,19 @@ while (my ($type) = $query_result->fetchrow_array()) {
foreach my $osid (keys(%osidtoimageid)) {
my $imageid = $osidtoimageid{$osid};
DBQueryFatal("replace into osidtoimageid values ".
DBQueryFatal("replace into temp_o2i values ".
"('$osid', '$type', '$imageid')");
}
}
#
# Ready to populate the tables. Move the entries from temp_images and
# temp_os_info across to the real tables.
#
DBQueryFatal("replace into images select * from temp_images");
DBQueryFatal("replace into os_info select * from temp_os_info");
DBQueryFatal("replace into osidtoimageid select * from temp_o2i");
exit(0);
sub fatal($)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment