Программирование →
Скрипт для PlanetLab. Удаление и добаление Nodes
Так как недавно пришлось вникать в тонкости пользования PlanetLab, я решила поделиться примером скрипта на автоматическое добавление-удаление нодов. Возможно, это в будущем сократит кому-нибудь время.
Опишу вкратце, о чем идет речь. PlanetLab – это сеть, широко используемая для тестирования новых сетевых сервисов или модификации уже существующих. Узлы PlanetLab (их около 1024-х) распределены в различных странах и доступ к ним получают только сотрудники тех учреждений, которые содержат у себя узлы PlanetLab. Более подробная статья о PlanetLab есть здесь.
Если вы занимаетесь разработкой распределенных приложений, без PlanetLab обойтись будет сложно. При тестировании распределенного приложения, Вам скорее всего придется иметь дело с большим количеством узлов (Nodes). Проблема состоит в том, что в PlanetLab ноды часто уходят в оффлайн. Соответственно, эти ноды нужно удалить из своего аккаунта (slice) и подключить взамен них новые. Это, безусловно, возможно сделать и через веб-интерфейс руками. Однако, процесс это муторный, поэтому луче всего использовать скрипт. Таким скриптом я и хочу в Вами поделиться. Написан он на питоне.
Описение всех методов API PlanetLab можно найти по адресу www.planet-lab.eu/doc/api. Сам скрипт постаралась снабдить достаточным колчеством комментариев, чтобы было понятно что происходит.
#!/usr/bin/env python
import xmlrpclib
import sys
plc_host = 'www.planet-lab.eu'
auth =
{ 'AuthMethod': 'gpg',
'name': 'your user name',
'signature': 'GnuPG signature',
}
slice_name = 'tudresdenple_backup'
api_url = «%s:443/PLCAPI/»%plc_host
#api_url = «%s/PLCAPI/»%plc_host
plc_api = xmlrpclib.ServerProxy(api_url,allow_none=True)
#get list of all nodes
print «Getting list of all attached to your slice nodes:»
nodes = plc_api.GetNodes(auth, {}, ['node_id', 'hostname', 'boot_state'])
#get ids of the nodes that already are added to you slice
attached_nodes_ids = plc_api.GetSlices(auth, [ slice_name ], ['node_ids'])[0]['node_ids']
#obtain nodes hostnames, which will look like {'hostname': ''}
attached_nodes = plc_api.GetNodes(auth, attached_nodes_ids, ['hostname', 'boot_state'])
#extract hostname only
have_nodes = []
for node in attached_nodes:
have_nodes.append(node['hostname'])
for node in have_nodes:
print node
#Filter all your nodes that are not in the boot state and therefor have to be deleted
print «Searching for non-boot nodes attached to you slice:»
to_delete = []
for node_record in attached_nodes:
if node_record['boot_state'] != 'boot':
to_delete.append(node_record['hostname'])
for node_record in to_delete:
print node_record
#delete those nodes
num_of_deleted = len(to_delete)
if num_of_deleted > 0:
success = plc_api.DeleteSliceFromNodes(auth, slice_name, to_delete)
if success == 1:
print «Successfullly detached non-booted nodes»
else:
print «Deleting of the non-booted nodes has failed!»
sys.exit()
else:
print «Nothing to delete or add»
sys.exit()
#add exactly the same number of new now, as the number of deleted ones
print «Adding new booted nodes»
to_add = []
for node_record in nodes:
if num_of_deleted > 0:
num_of_deleted -= num_of_deleted
else:
break
if (node_record['hostname'] not in have_nodes) and node_record['boot_state'] == 'boot':
to_add.append( node_record['hostname'] )
if len(to_add) > 0:
success = plc_api.AddSliceToNodes(auth, slice_name, to_add)
if success == 1:
print «Successfullly attached new nbooted nodes»
else:
print «Addint of the booted nodes has failed!»
sys.exit()
print «The following nodes were added:»
for node_record in to_add:
print node_record
Опишу вкратце, о чем идет речь. PlanetLab – это сеть, широко используемая для тестирования новых сетевых сервисов или модификации уже существующих. Узлы PlanetLab (их около 1024-х) распределены в различных странах и доступ к ним получают только сотрудники тех учреждений, которые содержат у себя узлы PlanetLab. Более подробная статья о PlanetLab есть здесь.
Если вы занимаетесь разработкой распределенных приложений, без PlanetLab обойтись будет сложно. При тестировании распределенного приложения, Вам скорее всего придется иметь дело с большим количеством узлов (Nodes). Проблема состоит в том, что в PlanetLab ноды часто уходят в оффлайн. Соответственно, эти ноды нужно удалить из своего аккаунта (slice) и подключить взамен них новые. Это, безусловно, возможно сделать и через веб-интерфейс руками. Однако, процесс это муторный, поэтому луче всего использовать скрипт. Таким скриптом я и хочу в Вами поделиться. Написан он на питоне.
Описение всех методов API PlanetLab можно найти по адресу www.planet-lab.eu/doc/api. Сам скрипт постаралась снабдить достаточным колчеством комментариев, чтобы было понятно что происходит.
#!/usr/bin/env python
import xmlrpclib
import sys
plc_host = 'www.planet-lab.eu'
auth =
{ 'AuthMethod': 'gpg',
'name': 'your user name',
'signature': 'GnuPG signature',
}
slice_name = 'tudresdenple_backup'
api_url = «%s:443/PLCAPI/»%plc_host
#api_url = «%s/PLCAPI/»%plc_host
plc_api = xmlrpclib.ServerProxy(api_url,allow_none=True)
#get list of all nodes
print «Getting list of all attached to your slice nodes:»
nodes = plc_api.GetNodes(auth, {}, ['node_id', 'hostname', 'boot_state'])
#get ids of the nodes that already are added to you slice
attached_nodes_ids = plc_api.GetSlices(auth, [ slice_name ], ['node_ids'])[0]['node_ids']
#obtain nodes hostnames, which will look like {'hostname': ''}
attached_nodes = plc_api.GetNodes(auth, attached_nodes_ids, ['hostname', 'boot_state'])
#extract hostname only
have_nodes = []
for node in attached_nodes:
have_nodes.append(node['hostname'])
for node in have_nodes:
print node
#Filter all your nodes that are not in the boot state and therefor have to be deleted
print «Searching for non-boot nodes attached to you slice:»
to_delete = []
for node_record in attached_nodes:
if node_record['boot_state'] != 'boot':
to_delete.append(node_record['hostname'])
for node_record in to_delete:
print node_record
#delete those nodes
num_of_deleted = len(to_delete)
if num_of_deleted > 0:
success = plc_api.DeleteSliceFromNodes(auth, slice_name, to_delete)
if success == 1:
print «Successfullly detached non-booted nodes»
else:
print «Deleting of the non-booted nodes has failed!»
sys.exit()
else:
print «Nothing to delete or add»
sys.exit()
#add exactly the same number of new now, as the number of deleted ones
print «Adding new booted nodes»
to_add = []
for node_record in nodes:
if num_of_deleted > 0:
num_of_deleted -= num_of_deleted
else:
break
if (node_record['hostname'] not in have_nodes) and node_record['boot_state'] == 'boot':
to_add.append( node_record['hostname'] )
if len(to_add) > 0:
success = plc_api.AddSliceToNodes(auth, slice_name, to_add)
if success == 1:
print «Successfullly attached new nbooted nodes»
else:
print «Addint of the booted nodes has failed!»
sys.exit()
print «The following nodes were added:»
for node_record in to_add:
print node_record
28.01.2012 05:02+0400