Commit b7c9fb8d authored by Samir Noir's avatar Samir Noir 🧀
Browse files

Add two controllers to glue around Kavlan's nodes API

parent baacbe6c
# Copyright (c) 2009-2011 Cyril Rohr, INRIA Rennes - Bretagne Atlantique
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
class VlansNodesAllController < ApplicationController
include Vlans
# Display nodes for a vlan
def index
allow :get
expires_in 60.seconds
nodes = @kavlan.nodes
result = format_nodes(nodes)
respond_to do |format|
format.g5kitemjson { render json: result }
format.json { render json: result }
end
end
def show
allow :get
expires_in 60.seconds
nodes = @kavlan.nodes(params[:node_name])
result = { 'uid' => nodes.first[0], 'vlan' => nodes.first[1] }
raise NotFound, 'Unknown node' if result['vlan'] == 'unknown'
result['links'] = links_for_item(result)
respond_to do |format|
format.g5kitemjson { render json: result }
format.json { render json: result }
end
end
# Get the vlan for a list of nodes
def vlan_for_nodes
ensure_authenticated!
allow :post
unless request.content_type == "application/json"
raise UnsupportedMediaType, "Content-Type #{request.content_type} not supported"
end
if params[:vlans_nodes_all][:_json].blank? ||
!params[:vlans_nodes_all][:_json].is_a?(Array)
raise UnprocessableEntity, "Missing node list"
end
nodes = @kavlan.vlan_for_nodes(params[:vlans_nodes_all][:_json])
nodes = JSON.parse(nodes.body)
nodes.delete_if { |_key, value| value == 'unknown_node' }
result = format_nodes(nodes)
respond_to do |format|
format.g5kitemjson { render json: result }
format.json { render json: result }
end
end
protected
def format_nodes(nodes)
result = {
'total' => nodes.length,
'offset' => 0,
'items' => nodes.map { |n| {'uid' => n[0], 'vlan' => n[1]} },
'links' => links_for_collection
}
result['items'].each do |item|
item['links'] = links_for_item(item)
end
result
end
def collection_path
site_vlans_nodes_path
end
def parent_path
site_vlans_path
end
def links_for_item(item)
links = []
links.push({
'rel' => 'self',
'href' => uri_to(File.join(collection_path, item['uid'])),
'type' => api_media_type(:g5kitemjson)
},
{
'rel' => 'parent',
'href' => uri_to(collection_path),
'type' => api_media_type(:g5kcollectionjson)
})
links
end
def links_for_collection
[
{
'rel' => 'self',
'href' => uri_to(collection_path),
'type' => api_media_type(:g5kcollectionjson)
},
{
'rel' => 'parent',
'href' => uri_to(parent_path),
'type' => api_media_type(:g5kcollectionjson)
}
]
end
end
# Copyright (c) 2009-2011 Cyril Rohr, INRIA Rennes - Bretagne Atlantique
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
class VlansNodesController < ApplicationController
include Vlans
# Display nodes for a vlan
def index
allow :get
expires_in 60.seconds
nodes = @kavlan.nodes_vlan(params[:vlan_id])
result = {
'total' => nodes.length,
'offset' => 0,
'items' => nodes.map { |n| {'uid'=> n} },
'links' => links_for_collection
}
result['items'].each do |item|
item['links'] = links_for_item(item)
end
respond_to do |format|
format.g5kitemjson { render json: result }
format.json { render json: result }
end
end
# Update the nodes inside a vlan (add only)
def add
ensure_authenticated!
allow :post
unless request.content_type == "application/json"
raise UnsupportedMediaType, "Content-Type #{request.content_type} not supported"
end
if params[:vlans_node][:_json].blank? || !params[:vlans_node][:_json].is_a?(Array)
raise UnprocessableEntity, "Missing node list"
end
result = @kavlan.update_vlan_nodes(params[:vlan_id], params[:vlans_node][:_json])
if result.code.to_i == 403
raise Forbidden, "Not enough privileges on Kavlan resources"
end
respond_to do |format|
format.g5kitemjson { render json: result.body }
format.json { render json: result.body }
end
end
protected
def collection_path
site_vlan_vlans_nodes_path
end
def parent_path
File.join(site_vlans_path, params[:vlan_id])
end
def links_for_item(item)
links = []
links.push({
'rel' => 'self',
'href' => uri_to(File.join(site_vlans_nodes_path, item['uid'])),
'type' => api_media_type(:g5kitemjson)
},
{
'rel' => 'parent',
'href' => uri_to(site_vlans_nodes_path),
'type' => api_media_type(:g5kcollectionjson)
})
links
end
def links_for_collection
[
{
'rel' => 'self',
'href' => uri_to(collection_path),
'type' => api_media_type(:g5kcollectionjson)
},
{
'rel' => 'parent',
'href' => uri_to(parent_path),
'type' => api_media_type(:g5kitemjson)
}
]
end
end
......@@ -25,6 +25,9 @@ Api::Application.routes.draw do
resources :network_equipments, only: %i[index show]
resources :sites, only: %i[index show] do
get '/vlans/nodes' => 'vlans_nodes_all#index'
get '/vlans/nodes/:node_name' => 'vlans_nodes_all#show', node_name: /[^\/]+/
post '/vlans/nodes' => 'vlans_nodes_all#vlan_for_nodes'
get '/vlans/users' => 'vlans_users_all#index'
get '/vlans/users/:user_id' => 'vlans_users_all#show'
......@@ -39,6 +42,9 @@ Api::Application.routes.draw do
put '/' => 'vlans_users#add'
end
end
resources :vlans_nodes, path: '/nodes', only: %i[index]
post '/nodes' => 'vlans_nodes#add'
end
member do
......
# Copyright (c) 2009-2011 Cyril Rohr, INRIA Rennes - Bretagne Atlantique
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require 'spec_helper'
describe VlansNodesAllController do
render_views
before do
@base_expected_uri = 'http://api-out.local/sites/rennes/internal/kavlanapi/'
@headers_return = { 'Content-Type' => 'application/json' }
stub_request(:get, @base_expected_uri).
with(
headers: {
'Accept'=>'application/json',
'Host'=>'api-out.local',
}).
to_return(status: 200, body: fixture('kavlan-rennes-root.json'), headers: @headers_return)
end
describe 'GET /vlans/nodes' do
it 'should return all the nodes' do
stub_request(:get, File.join(@base_expected_uri, 'nodes')).
with(
headers: {
'Accept'=>'application/json',
'Host'=>'api-out.local',
}).
to_return(status: 200, body: fixture('kavlan-rennes-nodes.json'), headers: @headers_return)
get :index, params: { site_id: 'rennes', format: :json }
expect(response.status).to eq(200)
expect(json).to be_a(Hash)
expect(json.length).to eq(4)
expect(json['total']).to eq(257)
expect(json['items'].length).to eq(257)
expect(json['items'].first['uid']).to eq('paranoia-1-eth1.rennes.grid5000.fr')
expect(json['items'].first['vlan']).to eq('DEFAULT')
expect(json['items'].first['links']).to eq([
{
'rel'=>'self',
'href'=>'/sites/rennes/vlans/nodes/paranoia-1-eth1.rennes.grid5000.fr',
'type'=>'application/vnd.grid5000.item+json'
},
{
'rel'=>'parent',
'href'=>'/sites/rennes/vlans/nodes',
'type'=>'application/vnd.grid5000.collection+json'
}
])
expect(json['links']).to eq([
{
'rel'=>'self',
'href'=>'/sites/rennes/vlans/nodes',
'type'=>'application/vnd.grid5000.collection+json'
},
{
'rel'=>'parent',
'href'=>'/sites/rennes/vlans',
'type'=>'application/vnd.grid5000.collection+json'
}
])
end
it 'should return a node' do
stub_request(:get, File.join(@base_expected_uri, 'nodes', 'paravance-9.rennes.grid5000.fr')).
with(
headers: {
'Accept'=>'application/json',
'Host'=>'api-out.local',
}).
to_return(status: 200, body: '{"paravance-9.rennes.grid5000.fr":"DEFAULT"}', headers: @headers_return)
get :show, params: { site_id: 'rennes', node_name: 'paravance-9.rennes.grid5000.fr', format: :json }
expect(response.status).to eq(200)
expect(json).to be_a(Hash)
expect(json.length).to eq(3)
expect(json['uid']).to eq('paravance-9.rennes.grid5000.fr')
expect(json['vlan']).to eq('DEFAULT')
expect(json['links']).to eq([
{
'rel'=>'self',
'href'=>'/sites/rennes/vlans/nodes/paravance-9.rennes.grid5000.fr',
'type'=>'application/vnd.grid5000.item+json'
},
{
'rel'=>'parent',
'href'=>'/sites/rennes/vlans/nodes',
'type'=>'application/vnd.grid5000.collection+json'
}
])
end
end
describe 'POST /vlans/nodes' do
it 'should return a list of nodes' do
stub_request(:post, File.join(@base_expected_uri, 'nodes')).
with(
headers: {
'Accept'=>'application/json',
'Host'=>'api-out.local',
},
body: {"nodes" => ['paravance-9.rennes.grid5000.fr',
'paravance-10.rennes.grid5000.fr']}
).
to_return(status: 200,
body: '{"paravance-9.rennes.grid5000.fr":"DEFAULT",
"paravance-10.rennes.grid5000.fr":"1"}',
headers: @headers_return)
authenticate_as('snoir')
request.content_type = 'application/json'
post :vlan_for_nodes, params: { site_id: 'rennes',
format: :json,
_json: ['paravance-9.rennes.grid5000.fr',
'paravance-10.rennes.grid5000.fr']}
expect(response.status).to eq(200)
expect(json).to be_a(Hash)
expect(json.length).to eq(4)
expect(json['total']).to eq(2)
expect(json['items'].length).to eq(2)
expect(json['items'].first['uid']).to eq('paravance-9.rennes.grid5000.fr')
expect(json['items'].first['vlan']).to eq('DEFAULT')
expect(json['items'].first['links']).to eq([
{
'rel'=>'self',
'href'=>'/sites/rennes/vlans/nodes/paravance-9.rennes.grid5000.fr',
'type'=>'application/vnd.grid5000.item+json'
},
{
'rel'=>'parent',
'href'=>'/sites/rennes/vlans/nodes',
'type'=>'application/vnd.grid5000.collection+json'
}
])
expect(json['links']).to eq([
{
'rel'=>'self',
'href'=>'/sites/rennes/vlans/nodes',
'type'=>'application/vnd.grid5000.collection+json'
},
{
'rel'=>'parent',
'href'=>'/sites/rennes/vlans',
'type'=>'application/vnd.grid5000.collection+json'
}
])
end
end
end
# Copyright (c) 2009-2011 Cyril Rohr, INRIA Rennes - Bretagne Atlantique
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require 'spec_helper'
describe VlansNodesController do
render_views
before do
@base_expected_uri = 'http://api-out.local/sites/rennes/internal/kavlanapi/'
@headers_return = { 'Content-Type' => 'application/json' }
stub_request(:get, @base_expected_uri).
with(
headers: {
'Accept'=>'application/json',
'Host'=>'api-out.local',
}).
to_return(status: 200, body: fixture('kavlan-rennes-root.json'), headers: @headers_return)
end
describe 'GET /vlans/:vlan_id/nodes' do
it 'should return a collection of nodes inside vlan 1' do
stub_request(:get, File.join(@base_expected_uri, '1', 'nodes')).
with(
headers: {
'Accept'=>'application/json',
'Host'=>'api-out.local',
}).
to_return(status: 200, body: fixture('kavlan-rennes-nodes-1.json'), headers: @headers_return)
get :index, params: { site_id: 'rennes', vlan_id: '1', format: :json }
expect(response.status).to eq(200)
expect(json).to be_a(Hash)
expect(json.length).to eq(4)
expect(json['total']).to eq(2)
expect(json['items']).to be_a(Array)
expect(json['items'].length).to eq(2)
expect(json['items'].first['uid']).to eq('parapide-18.rennes.grid5000.fr')
expect(json['items'].first['links']).to eq([
{
'rel'=>'self',
'href'=>'/sites/rennes/vlans/nodes/parapide-18.rennes.grid5000.fr',
'type'=>'application/vnd.grid5000.item+json'
},
{
'rel'=>'parent',
'href'=>'/sites/rennes/vlans/nodes',
'type'=>'application/vnd.grid5000.collection+json'
}
])
expect(json['links']).to eq([
{
'rel'=>'self',
'href'=>'/sites/rennes/vlans/1/nodes',
'type'=>'application/vnd.grid5000.collection+json'
},
{
'rel'=>'parent',
'href'=>'/sites/rennes/vlans/1',
'type'=>'application/vnd.grid5000.item+json'
}
])
end
end
describe 'POST /vlans/:vlan_id/nodes' do
it 'should add nodes to vlan 1' do
stub_request(:post, File.join(@base_expected_uri, '1')).
with(
headers: {
'Accept'=>'application/json',
'Host'=>'api-out.local',
},
body: {"nodes" => ['paravance-9.rennes.grid5000.fr', 'paravance-10.rennes.grid5000.fr']}
).
to_return(status: 200,
body: '{"paravance-9.rennes.grid5000.fr":"ok",
"paravance-10.rennes.grid5000.fr":"ok"}',
headers: @headers_return)
authenticate_as('snoir')
request.content_type = 'application/json'
post :add, params: { site_id: 'rennes',
format: :json,
vlan_id: 1,
_json: ['paravance-9.rennes.grid5000.fr',
'paravance-10.rennes.grid5000.fr']
}
expect(response.status).to eq(200)
expect(json).to be_a(Hash)
expect(json.length).to eq(2)
expect(json).to eq({"paravance-9.rennes.grid5000.fr" => "ok",
"paravance-10.rennes.grid5000.fr" => "ok"})
end
end
end
{"uid":"nodes","nodes":["parapide-18.rennes.grid5000.fr","parapide-19.rennes.grid5000.fr"],"links":[{"href":"/3.0/sites/rennes/vlans/1/nodes","rel":"self","type":"application/vnd.grid5000.item+json"},{"href":"/3.0/sites/rennes/vlans/1","rel":"parent","type":"application/vnd.grid5000.item+json"}]}
\ No newline at end of file
{"paranoia-1-eth1.rennes.grid5000.fr":"DEFAULT","paranoia-1-eth2.rennes.grid5000.fr":"DEFAULT","paranoia-1.rennes.grid5000.fr":"DEFAULT","paranoia-2-eth1.rennes.grid5000.fr":"DEFAULT","paranoia-2-eth2.rennes.grid5000.fr":"DEFAULT","paranoia-2.rennes.grid5000.fr":"DEFAULT","paranoia-3-eth1.rennes.grid5000.fr":"DEFAULT","paranoia-3-eth2.rennes.grid5000.fr":"DEFAULT","paranoia-3.rennes.grid5000.fr":"DEFAULT","paranoia-4-eth1.rennes.grid5000.fr":"DEFAULT","paranoia-4-eth2.rennes.grid5000.fr":"DEFAULT","paranoia-4.rennes.grid5000.fr":"DEFAULT","paranoia-5-eth1.rennes.grid5000.fr":"DEFAULT","paranoia-5-eth2.rennes.grid5000.fr":"DEFAULT","paranoia-5.rennes.grid5000.fr":"DEFAULT","paranoia-6-eth1.rennes.grid5000.fr":"DEFAULT","paranoia-6-eth2.rennes.grid5000.fr":"DEFAULT","paranoia-6.rennes.grid5000.fr":"DEFAULT","paranoia-7-eth1.rennes.grid5000.fr":"DEFAULT","paranoia-7-eth2.rennes.grid5000.fr":"DEFAULT","paranoia-7.rennes.grid5000.fr":"DEFAULT","paranoia-8-eth1.rennes.grid5000.fr":"DEFAULT","paranoia-8-eth2.rennes.grid5000.fr":"DEFAULT","paranoia-8.rennes.grid5000.fr":"DEFAULT","parapide-1.rennes.grid5000.fr":"DEFAULT","parapide-10.rennes.grid5000.fr":"DEFAULT","parapide-12.rennes.grid5000.fr":"DEFAULT","parapide-13.rennes.grid5000.fr":"DEFAULT","parapide-16.rennes.grid5000.fr":"DEFAULT","parapide-18.rennes.grid5000.fr":"DEFAULT","parapide-19.rennes.grid5000.fr":"DEFAULT","parapide-2.rennes.grid5000.fr":"DEFAULT","parapide-21.rennes.grid5000.fr":"DEFAULT","parapide-24.rennes.grid5000.fr":"DEFAULT","parapide-25.rennes.grid5000.fr":"DEFAULT","parapide-3.rennes.grid5000.fr":"DEFAULT","parapide-5.rennes.grid5000.fr":"DEFAULT","parapide-6.rennes.grid5000.fr":"DEFAULT","parapide-7.rennes.grid5000.fr":"DEFAULT","parapide-8.rennes.grid5000.fr":"DEFAULT","parapide-9.rennes.grid5000.fr":"DEFAULT","parapluie-1.rennes.grid5000.fr":"DEFAULT","parapluie-11.rennes.grid5000.fr":"DEFAULT","parapluie-12.rennes.grid5000.fr":"DEFAULT","parapluie-15.rennes.grid5000.fr":"DEFAULT","parapluie-19.rennes.grid5000.fr":"DEFAULT","parapluie-2.rennes.grid5000.fr":"DEFAULT","parapluie-20.rennes.grid5000.fr":"DEFAULT","parapluie-21.rennes.grid5000.fr":"DEFAULT","parapluie-22.rennes.grid5000.fr":"DEFAULT","parapluie-25.rennes.grid5000.fr":"DEFAULT","parapluie-28.rennes.grid5000.fr":"DEFAULT","parapluie-31.rennes.grid5000.fr":"DEFAULT","parapluie-32.rennes.grid5000.fr":"DEFAULT","parapluie-35.rennes.grid5000.fr":"DEFAULT","parapluie-38.rennes.grid5000.fr":"DEFAULT","parapluie-9.rennes.grid5000.fr":"DEFAULT","parasilo-1-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-1.rennes.grid5000.fr":"DEFAULT","parasilo-10-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-10.rennes.grid5000.fr":"DEFAULT","parasilo-11-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-11.rennes.grid5000.fr":"DEFAULT","parasilo-12-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-12.rennes.grid5000.fr":"DEFAULT","parasilo-13-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-13.rennes.grid5000.fr":"DEFAULT","parasilo-14-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-14.rennes.grid5000.fr":"DEFAULT","parasilo-15-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-15.rennes.grid5000.fr":"DEFAULT","parasilo-16-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-16.rennes.grid5000.fr":"DEFAULT","parasilo-17-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-17.rennes.grid5000.fr":"DEFAULT","parasilo-18-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-18.rennes.grid5000.fr":"DEFAULT","parasilo-19-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-19.rennes.grid5000.fr":"DEFAULT","parasilo-2-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-2.rennes.grid5000.fr":"DEFAULT","parasilo-20-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-20.rennes.grid5000.fr":"DEFAULT","parasilo-21-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-21.rennes.grid5000.fr":"DEFAULT","parasilo-22-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-22.rennes.grid5000.fr":"DEFAULT","parasilo-23-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-23.rennes.grid5000.fr":"DEFAULT","parasilo-24-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-24.rennes.grid5000.fr":"DEFAULT","parasilo-25-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-25.rennes.grid5000.fr":"DEFAULT","parasilo-26-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-26.rennes.grid5000.fr":"DEFAULT","parasilo-27-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-27.rennes.grid5000.fr":"DEFAULT","parasilo-28-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-28.rennes.grid5000.fr":"DEFAULT","parasilo-3-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-3.rennes.grid5000.fr":"DEFAULT","parasilo-4-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-4.rennes.grid5000.fr":"DEFAULT","parasilo-5-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-5.rennes.grid5000.fr":"DEFAULT","parasilo-6-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-6.rennes.grid5000.fr":"DEFAULT","parasilo-7-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-7.rennes.grid5000.fr":"DEFAULT","parasilo-8-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-8.rennes.grid5000.fr":"DEFAULT","parasilo-9-eth1.rennes.grid5000.fr":"DEFAULT","parasilo-9.rennes.grid5000.fr":"DEFAULT","paravance-1-eth1.rennes.grid5000.fr":"DEFAULT","paravance-1.rennes.grid5000.fr":"DEFAULT","paravance-10-eth1.rennes.grid5000.fr":"DEFAULT","paravance-10.rennes.grid5000.fr":"DEFAULT","paravance-11-eth1.rennes.grid5000.fr":"DEFAULT","paravance-11.rennes.grid5000.fr":"DEFAULT","paravance-12-eth1.rennes.grid5000.fr":"DEFAULT","paravance-12.rennes.grid5000.fr":"DEFAULT","paravance-13-eth1.rennes.grid5000.fr":"DEFAULT","paravance-13.rennes.grid5000.fr":"DEFAULT","paravance-14-eth1.rennes.grid5000.fr":"DEFAULT","paravance-14.rennes.grid5000.fr":"DEFAULT","paravance-15-eth1.rennes.grid5000.fr":"DEFAULT","paravance-15.rennes.grid5000.fr":"DEFAULT","paravance-16-eth1.rennes.grid5000.fr":"DEFAULT","paravance-16.rennes.grid5000.fr":"DEFAULT","paravance-17-eth1.rennes.grid5000.fr":"DEFAULT","paravance-17.rennes.grid5000.fr":"DEFAULT","paravance-18-eth1.rennes.grid5000.fr":"DEFAULT","paravance-18.rennes.grid5000.fr":"DEFAULT","paravance-19-eth1.rennes.grid5000.fr":"DEFAULT","paravance-19.rennes.grid5000.fr":"DEFAULT","paravance-2-eth1.rennes.grid5000.fr":"DEFAULT","paravance-2.rennes.grid5000.fr":"DEFAULT","paravance-20-eth1.rennes.grid5000.fr":"DEFAULT","paravance-20.rennes.grid5000.fr":"DEFAULT","paravance-21-eth1.rennes.grid5000.fr":"DEFAULT","paravance-21.rennes.grid5000.fr":"DEFAULT","paravance-22-eth1.rennes.grid5000.fr":"DEFAULT","paravance-22.rennes.grid5000.fr":"DEFAULT","paravance-23-eth1.rennes.grid5000.fr":"DEFAULT","paravance-23.rennes.grid5000.fr":"DEFAULT","paravance-24-eth1.rennes.grid5000.fr":"DEFAULT","paravance-24.rennes.grid5000.fr":"DEFAULT","paravance-25-eth1.rennes.grid5000.fr":"DEFAULT","paravance-25.rennes.grid5000.fr":"DEFAULT","paravance-26-eth1.rennes.grid5000.fr":"DEFAULT","paravance-26.rennes.grid5000.fr":"DEFAULT","paravance-27-eth1.rennes.grid5000.fr":"DEFAULT","paravance-27.rennes.grid5000.fr":"DEFAULT","paravance-28-eth1.rennes.grid5000.fr":"DEFAULT","paravance-28.rennes.grid5000.fr":"DEFAULT","paravance-29-eth1.rennes.grid5000.fr":"DEFAULT","paravance-29.rennes.grid5000.fr":"DEFAULT","paravance-3-eth1.rennes.grid5000.fr":"DEFAULT","paravance-3.rennes.grid5000.fr":"DEFAULT","paravance-30-eth1.rennes.grid5000.fr":"DEFAULT","paravance-30.rennes.grid5000.fr":"DEFAULT","paravance-31-eth1.rennes.grid5000.fr":"DEFAULT","paravance-31.rennes.grid5000.fr":"DEFAULT","paravance-32-eth1.rennes.grid5000.fr":"DEFAULT","paravance-32.rennes.grid5000.fr":"DEFAULT","paravance-33-eth1.rennes.grid5000.fr":"DEFAULT","paravance-33.rennes.grid5000.fr":"DEFAULT","paravance-34-eth1.rennes.grid5000.fr":"DEFAULT","paravance-34.rennes.grid5000.fr":"DEFAULT","paravance-35-eth1.rennes.grid5000.fr":"DEFAULT","paravance-35.rennes.grid5000.fr":"DEFAULT","paravance-36-eth1.rennes.grid5000.fr":"DEFAULT","paravance-36.rennes.grid5000.fr":"DEFAULT","paravance-37-eth1.rennes.grid5000.fr":"DEFAULT","paravance-37.rennes.grid5000.fr":"DEFAULT","paravance-38-eth1.rennes.grid5000.fr":"DEFAULT","paravance-38.rennes.grid5000.fr":"DEFAULT","paravance-39-eth1.rennes.grid5000.fr":"DEFAULT","paravance-39.rennes.grid5000.fr":"DEFAULT","paravance-4-eth1.rennes.grid5000.fr":"DEFAULT","paravance-4.rennes.grid5000.fr":"DEFAULT","paravance-40-eth1.rennes.grid5000.fr":"DEFAULT","paravance-40.rennes.grid5000.fr":"DEFAULT","paravance-41-eth1.rennes.grid5000.fr":"DEFAULT","paravance-41.rennes.grid5000.fr":"DEFAULT","paravance-42-eth1.rennes.grid5000.fr":"DEFAULT","paravance-42.rennes.grid5000.fr":"DEFAULT","paravance-43-eth1.rennes.grid5000.fr":"DEFAULT","paravance-43.rennes.grid5000.fr":"DEFAULT","paravance-44-eth1.rennes.grid5000.fr":"DEFAULT","paravance-44.rennes.grid5000.fr":"DEFAULT","paravance-45-eth1.rennes.grid5000.fr":"DEFAULT","paravance-45.rennes.grid5000.fr":"DEFAULT","paravance-46-eth1.rennes.grid5000.fr":"DEFAULT","paravance-46.rennes.grid5000.fr":"DEFAULT","paravance-47-eth1.rennes.grid5000.fr":"DEFAULT","paravance-47.rennes.grid5000.fr":"DEFAULT","paravance-48-eth1.rennes.grid5000.fr":"DEFAULT","paravance-48.rennes.grid5000.fr":"DEFAULT","paravance-49-eth1.rennes.grid5000.fr":"DEFAULT","paravance-49.rennes.grid5000.fr":"DEFAULT","paravance-5-eth1.rennes.grid5000.fr":"DEFAULT","paravance-5.rennes.grid5000.fr":"DEFAULT","paravance-50-eth1.rennes.grid5000.fr":"DEFAULT","paravance-50.rennes.grid5000.fr":"DEFAULT","paravance-51-eth1.rennes.grid5000.fr":"DEFAULT","paravance-51.rennes.grid5000.fr":"DEFAULT","paravance-52-eth1.rennes.grid5000.fr":"DEFAULT","paravance-52.rennes.grid5000.fr":"DEFAULT","paravance-53-eth1.rennes.grid5000.fr":"DEFAULT","paravance-53.rennes.grid5000.fr":"DEFAULT","paravance-54-eth1.rennes.grid5000.fr":"DEFAULT","paravance-54.rennes.grid5000.fr":"DEFAULT","paravance-55-eth1.rennes.grid5000.fr":"DEFAULT","paravance-55.rennes.grid5000.fr":"DEFAULT","paravance-56-eth1.rennes.grid5000.fr":"DEFAULT","paravance-56.rennes.grid5000.fr":"DEFAULT","paravance-57-eth1.rennes.grid5000.fr":"DEFAULT","paravance-57.rennes.grid5000.fr":"DEFAULT","paravance-58-eth1.rennes.grid5000.fr":"DEFAULT","paravance-58.rennes.grid5000.fr":"DEFAULT","paravance-59-eth1.rennes.grid5000.fr":"DEFAULT","paravance-59.rennes.grid5000.fr":"DEFAULT","paravance-6-eth1.rennes.grid5000.fr":"DEFAULT","paravance-6.rennes.grid5000.fr":"DEFAULT","paravance-60-eth1.rennes.grid5000.fr":"DEFAULT","paravance-60.rennes.grid5000.fr":"DEFAULT","paravance-61-eth1.rennes.grid5000.fr":"DEFAULT","paravance-61.rennes.grid5000.fr":"DEFAULT","paravance-62-eth1.rennes.grid5000.fr":"DEFAULT","paravance-62.rennes.grid5000.fr":"DEFAULT","paravance-63-eth1.rennes.grid5000.fr":"DEFAULT","paravance-63.rennes.grid5000.fr":"DEFAULT","paravance-64-eth1.rennes.grid5000.fr":"DEFAULT","paravance-64.rennes.grid5000.fr":"DEFAULT","paravance-65-eth1.rennes.grid5000.fr":"DEFAULT","paravance-65.rennes.grid5000.fr":"DEFAULT","paravance-66-eth1.rennes.grid5000.fr":"DEFAULT","paravance-66.rennes.grid5000.fr":"DEFAULT","paravance-67-eth1.rennes.grid5000.fr":"DEFAULT","paravance-67.rennes.grid5000.fr":"DEFAULT","paravance-68-eth1.rennes.grid5000.fr":"DEFAULT","paravance-68.rennes.grid5000.fr":"DEFAULT","paravance-69-eth1.rennes.grid5000.fr":"DEFAULT","paravance-69.rennes.grid5000.fr":"DEFAULT","paravance-7-eth1.rennes.grid5000.fr":"DEFAULT","paravance-7.rennes.grid5000.fr":"DEFAULT","paravance-70-eth1.rennes.grid5000.fr":"DEFAULT","paravance-70.rennes.grid5000.fr":"DEFAULT","paravance-71-eth1.rennes.grid5000.fr":"16","paravance-71.rennes.grid5000.fr":"DEFAULT","paravance-72-eth1.rennes.grid5000.fr":"DEFAULT","paravance-72.rennes.grid5000.fr":"DEFAULT","paravance-8-eth1.rennes.grid5000.fr":"DEFAULT","paravance-8.rennes.grid5000.fr":"DEFAULT","paravance-9-eth1.rennes.grid5000.fr":"DEFAULT","paravance-9.rennes.grid5000.fr":"DEFAULT"}
\ No newline at end of file
Supports Markdown
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