--- /dev/null
+#!/usr/bin/env python
+###
+##############################
+###
+### preparation / requirements
+###
+### two separate instances of myplc
+### for now they are located on the same box on lurch
+###
+### expectations :
+### your myplcs should more or less come out of the box,
+### I prefer not to alter the default PLC_ROOT_USER value,
+### instead we create a PI account on the site_id=1
+###
+##############################
+###
+### HOWTO
+###
+### ----------------------------------------
+### # run sql commands - PLC1
+###
+### $ chroot /plc1/root psql planetlab4 pgsqluser
+###
+### # run sql commands - PLC2
+###
+### $ chroot /plc2/root psql -h localhost -p 5433 planetlab4 pgsqluser
+### but then a password is required
+### 9a61ae18-779e-41b6-8a6c-67c439dc73e5
+###
+### ----------------------------------------
+### # connecting to the API - PLC1
+###
+### $ chroot /plc1/root
+### $ ./Shell.py --config /plc1/root/data/etc/planetlab/plc_config
+###
+### # connecting to the API - PLC2
+###
+### $ chroot /plc2/root
+###
+### $ ./Shell.py --config /plc2/root/data/etc/planetlab/plc_config -h https://localhost:444/PLCAPI/
+###
+### ----------------------------------------
+##############################
+
+import xmlrpclib
+
+plc1={ 'name':'plc1 in federation',
+ 'root':'/plc1/root',
+ 'url':'https://lurch.cs.princeton.edu:443/',
+ 'admin_id':'plc1@planet-lab.org',
+ 'admin_password':'root',
+ 'dbport':5432,
+ 'nodename':'n11.plc1.org'
+ }
+plc2={ 'name':'plc2 in federation',
+ 'root':'/plc1/root',
+ 'url':'https://lurch.cs.princeton.edu:444/',
+ 'admin_id':'plc2@planet-lab.org',
+ 'admin_password':'root',
+ 'dbport':5433,
+ 'nodename':'n21.plc2.org'
+ }
+
+plc=[plc1,plc2]
+# the server objects
+s=[None,None]
+# the authentication objects
+a=[None,None]
+
+### cant use digits in slice login name
+def plain_name (i):
+ if i==1:
+ return 'one'
+ elif i==2:
+ return 'two'
+ else:
+ raise Exception,"Unexpected input in plain_name"
+
+def test00_init (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ url=plc[i]['url']+'/PLCAPI/'
+ s[i]=xmlrpclib.Server(url)
+ print 'initializing s[%d]'%i,url
+ a[i]={'Username':plc[i]['admin_id'],
+ 'AuthMethod':'password',
+ 'AuthString':plc[i]['admin_password'],
+ 'Role':'admin'}
+ print 'initialized a[%d]'%i, a[i]
+
+def test00_check (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ n=len(s[i].GetNodes(a[i]))
+ f=len(s[i].GetForeignNodes(a[i]))
+ print 'Checking connection: got %d local nodes & %d foreign nodes'%(n,f)
+
+def test01_pi (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ peer=1-i
+ plc[i]['pi_id']=s[i].AddPerson(a[i],{'first_name':'Local', 'last_name':'PI', 'role_ids':[20],
+ 'email':plc[i]['admin_id'],'password':plc[id]['admin_password']})
+
+def test01_node (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ n=s[i].AddNode(a[i],1,{'hostname': plc[i]['nodename']})
+ print '%02d: Added node %d %s',(i+1,n,plc[i]['nodename'])
+
+def test01_peer_person (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ peer=1-i
+ person_id = s[i].AddPerson (a[i], {'first_name':'Peering', 'last_name':plc[peer]['name'], 'role_ids':[3000],
+ 'email':plc[peer]['admin_id'],'password':plc[peer]['admin_password']})
+ print '02%d:Created person %d as the peer person'%(i+1,person_id)
+ plc[i]['peer_person_id']=person_id
+
+def test01_peer (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ peer=1-i
+ peer_id=s[i].AddPeer (a[i], {'peername':plc[peer]['name'],'peer_url':plc[peer]['url'],'person_id':plc[i]['peer_person_id']})
+ # NOTE : need to manually reset the encrypted password through SQL at this point
+ print '%02d:Created peer %d'%(i+1,peer_id)
+ plc[i]['peer_id']=peer_id
+ print "Please MANUALLY set passwd for person_id=%d in DB%d"%(person_id,i+1)
+
+def test02_refresh (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ print '%02d: Refreshing peer'%(i+1)
+ s[i].RefreshPeer(plc[i]['peer_id'])
+ ###### at this stage both sites know about two nodes, one local and one foreign
+
+def test03_site (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ peer=1-i
+ ### create a site (required for creating a slice)
+ sitename="site"+str(i+1)
+ abbrev_name="abbr"+str(i+1)
+ plain=plain_name(i+1)
+ site_id=s[i].AddSite (a[i], {'name':plc[i]['name'],
+ 'abbreviated_name': abbrev_name,
+ 'login_base': plain,
+ 'is_public': True,
+ 'url': 'http://%s.com/'%abbrev_name,
+ 'max_slices':10})
+ ### max_slices does not seem taken into account at that stage
+ s[i].UpdateSite(a[i],plc[i]['site_id'],{'max_slices':10})
+ print '%02d: Created site %d with max_slices=10'%(i+1,site_id)
+ plc[i]['site_id']=site_id
+
+def test03_slice (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ peer=1-i
+ plain=plain_name(i+1)
+ ### create a slice
+ slice_name="slic"+str(i+1)
+ slice_id=s[i].AddSlice (a[i],{'name':'%s_%s'%(plain,slice_name),
+ 'description':'slice %s_%s on plc %s'%(plain,slice_name,plc[i]['name']),
+ 'url':'http://planet-lab.org/%s'%slice_name,
+ 'max_nodes':100,
+ 'instanciation':'plc-instantiated',
+ })
+ print '%02d: created slice %d'%(i+1,slice_id)
+ plc[i]['slice_id']=slice_id
+
+
+def test04_lnode (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ ### add node to it
+ hostname=plc[i]['nodename']
+ s[i].AddSliceToNodes (a[i], plc[i]['slice_id'],hostname)
+ print '%02d: added local node %s'%(i+1,hostname)
+
+def test04_fnode (args=[0,1]):
+ global plc,s,a
+ for i in args:
+ peer=1-i
+ ### add node to it
+ hostname=plc[peer]['nodename']
+ s[i].AddSliceToNodes (a[i], plc[i]['slice_id'],hostname)
+ print '%02d: added local node %s'%(i+1,hostname)
+