最近、PlanetLabの使用の複雑さを詳しく調べる必要があったため、ノードを自動的に追加および削除するためのサンプルスクリプトを共有することにしました。 おそらくこれは将来誰かの時間を短縮するでしょう。
危機にwhatしているものについて簡単に説明します。 PlanetLabは、新しいネットワークサービスのテストや既存のサービスの変更に広く使用されているネットワークです。 PlanetLabノード(約1024個あります)はさまざまな国で配布されており、PlanetLabノードをホストしている機関の従業員のみがアクセスできます。 PlanetLabに関する詳細な記事はこちらです。
分散アプリケーションを開発している場合、PlanetLabなしで行うことは困難です。 分散アプリケーションをテストする場合、多くのノード(ノード)を処理する必要があります。 問題は、PlanetLabでは、ノードがしばしばオフラインになることです。 したがって、これらのノードをアカウント(スライス)から削除し、接続して新しいノードと置き換える必要があります。 Webインターフェースでも同様にこれを行うことができます。 ただし、プロセスは退屈なので、スクリプトを使用するのが最善です。 また、このスクリプトをあなたと共有したいと思います。 Pythonで書かれています。
すべてのPlanetLab APIメソッドの説明は、 www.planet-lab.eu / doc / apiにあります。 スクリプト自体は、何が起こっているのかが明確になるように、十分な数のコメントを提供しようとしました。
#!/ usr / bin / env python
xmlrpclibをインポートする
インポートシステム
plc_host = 'www.planet-lab.eu'
auth =
{ 'AuthMethod' : 'gpg' 、
「名前」 : 「ユーザー名」 、
'signature' : 'GnuPG署名' 、
}
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)
#すべてのノードのリストを取得
「スライスノードに接続されているすべてのリストを取得する:」
nodes = plc_api.GetNodes(auth、{}、[ 'node_id' 、 'hostname' 、 'boot_state' ])
#スライスに既に追加されているノードのIDを取得
attachment_nodes_ids = plc_api.GetSlices(auth、[slice_name]、[ 'node_ids' ])[0] [ 'node_ids' ]
#{'hostname': ''}のように見えるノードのホスト名を取得します
attachment_nodes = plc_api.GetNodes(auth、attached_nodes_ids、[ 'hostname' 、 'boot_state' ])
#ホスト名のみを抽出
have_nodes = []
attach_nodesのノードの場合:
have_nodes.append(ノード[ 'ホスト名' ])
have_nodesのノードの場合:
印刷ノード
#ブート状態にないすべてのノードをフィルタリングするため、削除する必要があります
「スライスに接続された非ブートノードの検索:」
to_delete = []
attach_nodesのnode_recordの場合:
if node_record [ 'boot_state' ]!= 'boot' :
to_delete.append(node_record [ 'ホスト名' ])
to_deleteのnode_recordの場合:
node_recordを印刷
#それらのノードを削除
num_of_deleted = len (to_delete)
num_of_deleted> 0の場合 :
success = plc_api.DeleteSliceFromNodes(auth、slice_name、to_delete)
成功== 1の場合 :
「正常に切り離された起動されていないノード」を出力します
その他 :
「ブートされていないノードの削除に失敗しました!」
sys.exit()
その他 :
「削除または追加するものはありません」を印刷します
sys.exit()
#削除されたものとまったく同じ数の新しいものを今すぐ追加
「新しい起動ノードの追加」を 印刷します
to_add = []
ノードのnode_recordの場合:
num_of_deleted> 0の場合 :
num_of_deleted-= num_of_deleted
その他 :
破る
if (node_record [ 'hostname' ] not have have_nodes)and node_record [ 'boot_state' ] == 'boot' :
to_add.append(node_record [ 'ホスト名' ])
len (to_add)> 0の場合:
success = plc_api.AddSliceToNodes(auth、slice_name、to_add)
成功== 1の場合 :
「正常に接続された新しいnbootedノード」を 印刷します
その他 :
print "起動されたノードのAddintが失敗しました!"
sys.exit()
「次のノードが追加されました:」
to_addのnode_recordの場合:
node_recordを印刷