wakame-adapters-tengine 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +9 -0
- data/Gemfile.lock +31 -0
- data/README +74 -0
- data/Rakefile +28 -0
- data/VERSION +1 -0
- data/lib/apis/ec2.rb +145 -0
- data/lib/apis/wakame.rb +206 -0
- data/lib/controllers/controller.rb +70 -0
- data/lib/tama.rb +23 -0
- data/test/calltama +93 -0
- data/test/calltama.yml +25 -0
- data/test/generic_test.rb +13 -0
- data/test/spec/config.yml +31 -0
- data/test/spec/real_api_spec.rb +39 -0
- data/test/spec/spec_helper.rb +101 -0
- data/test/test_files/describe_images.json +65 -0
- data/test/test_files/describe_instances.json +115 -0
- data/test/test_files/host_nodes.json +22 -0
- data/test/test_files/run_instances.json +30 -0
- data/test/test_files/show_instance_specs.json +23 -0
- data/test/test_files/terminate_instances.json +3 -0
- data/wakame-adapters-tengine.gemspec +65 -0
- metadata +114 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'right_aws'
|
5
|
+
|
6
|
+
module Tama
|
7
|
+
module Controllers
|
8
|
+
A = Tama::Apis
|
9
|
+
|
10
|
+
# A Controller just passes any method calls it gets to its api
|
11
|
+
# The api can be whatever class you want it to be.
|
12
|
+
#
|
13
|
+
# A Controller can contain one api or an array of apis. In case of an array
|
14
|
+
# TamaController checks each of its apis in turn and executes the method
|
15
|
+
# on the first API that supports it
|
16
|
+
class Controller
|
17
|
+
attr_accessor :api
|
18
|
+
|
19
|
+
def initialize(api)
|
20
|
+
self.api = api
|
21
|
+
end
|
22
|
+
|
23
|
+
def method_missing(method_name,*args)
|
24
|
+
if self.api.is_a? Array
|
25
|
+
index = 0
|
26
|
+
begin
|
27
|
+
self.api[index].send(method_name,*args)
|
28
|
+
rescue NoMethodError => e
|
29
|
+
index += 1
|
30
|
+
raise if index == self.api.length || (not method_name == e.name)
|
31
|
+
retry
|
32
|
+
end
|
33
|
+
else
|
34
|
+
api.send(method_name)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# The TamaController is a controller that has two apis
|
40
|
+
# A RightAws::Ec2 object for handling Amazon Ec2 requests and
|
41
|
+
# a WakameApi for handling requests to Wakame-vdc
|
42
|
+
class TamaController < Controller
|
43
|
+
def initialize(access_key,ec2_host,ec2_port,ec2_protocol,wakame_host,wakame_port,wakame_protocol)
|
44
|
+
super([
|
45
|
+
A::WakameApi.new(access_key,wakame_host,wakame_port,wakame_protocol),
|
46
|
+
RightAws::Ec2.new(access_key,"dummy",{:server => ec2_host,:port => ec2_port,:protocol => ec2_protocol})
|
47
|
+
])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# TamaTestController does the same as TamaController but
|
52
|
+
# reads output from a file on disk. It doesn't actually make
|
53
|
+
# any requests to Wakame or Ec2
|
54
|
+
class TamaTestController < TamaController
|
55
|
+
def initialize
|
56
|
+
self.api = [A::WakameApiTest.new,A::Ec2ApiTest.new]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class ControllerFactory
|
61
|
+
def self.create_controller(*args)
|
62
|
+
case
|
63
|
+
when args.first == :test || args.first == "test" then
|
64
|
+
TamaTestController.new
|
65
|
+
else TamaController.new(*args)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/tama.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
|
5
|
+
load_path = "#{File.expand_path(File.dirname(__FILE__))}/lib"
|
6
|
+
$LOAD_PATH.unshift(load_path) unless $LOAD_PATH.include?(load_path)
|
7
|
+
|
8
|
+
require 'apis/ec2'
|
9
|
+
require 'apis/wakame'
|
10
|
+
require 'controllers/controller'
|
11
|
+
|
12
|
+
module Tama
|
13
|
+
# Just a wrapper class for our controller to make the syntax a bit more beautiful ^_~
|
14
|
+
class Tama
|
15
|
+
def initialize(*args)
|
16
|
+
@controller = Controllers::ControllerFactory.create_controller(*args)
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_missing(m,*args)
|
20
|
+
@controller.send(m,*args)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/test/calltama
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
load_path = "#{File.expand_path(File.dirname(__FILE__))}/../lib"
|
5
|
+
$LOAD_PATH.unshift(load_path) unless $LOAD_PATH.include?(load_path)
|
6
|
+
|
7
|
+
require 'tama'
|
8
|
+
|
9
|
+
def usage
|
10
|
+
bin_name = "calltama"
|
11
|
+
"Usage:
|
12
|
+
ruby #{bin_name} [test] [command] [options]
|
13
|
+
|
14
|
+
Test:
|
15
|
+
Using the word test as the first paremeter causes all output to be read from a file.
|
16
|
+
|
17
|
+
Commands:
|
18
|
+
run_instances # Start a new instance using the data defined in #{bin_name}.yml.
|
19
|
+
describe_instances [instance_ids] # Show the alive instances.
|
20
|
+
terminate_instances instance_ids # Terminate alive instances.
|
21
|
+
describe_images [image_ids] # Describes images in the database.
|
22
|
+
describe_host_nodes [host_ids] # Describes host nodes in the database
|
23
|
+
describe_instance_specs [spec_ids] # Describes instance specs in the database
|
24
|
+
|
25
|
+
Examples:
|
26
|
+
#{bin_name} test describe_instances
|
27
|
+
#{bin_name} run_instances
|
28
|
+
#{bin_name} terminate instances i-dlobuy33 i-8390cvle
|
29
|
+
#{bin_name} test describe_images wmi-lucid0 wmi-lucid5"
|
30
|
+
end
|
31
|
+
|
32
|
+
if ARGV[0] == "help" || ARGV[0] == "--help" || ARGV[0] == "-h"
|
33
|
+
puts usage
|
34
|
+
exit 0
|
35
|
+
end
|
36
|
+
|
37
|
+
begin
|
38
|
+
require 'yaml'
|
39
|
+
config = YAML.load_file File.expand_path('../calltama.yml', __FILE__)
|
40
|
+
rescue
|
41
|
+
puts "Warning: Config file (calltama.yml) not found."
|
42
|
+
config = {}
|
43
|
+
end
|
44
|
+
|
45
|
+
#Arguments for Tama
|
46
|
+
Account = config["Account"]
|
47
|
+
|
48
|
+
Ec2_host = config["Ec2_host"]
|
49
|
+
Ec2_port = config["Ec2_port"]
|
50
|
+
Ec2_protocol = config["Ec2_protocol"]
|
51
|
+
|
52
|
+
Wakame_host = config["Wakame_host"]
|
53
|
+
Wakame_port = config["Wakame_port"]
|
54
|
+
Wakame_protocol = config["Wakame_protocol"]
|
55
|
+
|
56
|
+
#Put the instances you want to terminate in this array
|
57
|
+
Instances_to_terminate = config["Instances_to_terminate"]
|
58
|
+
|
59
|
+
#Arguments for run_instances
|
60
|
+
Image_id = config["Image_id"]
|
61
|
+
Min = config["Min"]
|
62
|
+
Max = config["Max"]
|
63
|
+
Security_Groups = config["Security_Groups"]
|
64
|
+
SSH_Key = config["SSH_Key"]
|
65
|
+
User_Data = config["User_Data"]
|
66
|
+
Addressing_Type = config["Addressing_Type"]
|
67
|
+
Instance_Type = config["Instance_Type"]
|
68
|
+
HOST = config["HOST"]
|
69
|
+
|
70
|
+
if ARGV[0] == "test"
|
71
|
+
c = Tama::Tama.new(:test)
|
72
|
+
args = ARGV.slice(1..ARGV.length) || []
|
73
|
+
else
|
74
|
+
c = Tama::Tama.new(Account,Ec2_host,Ec2_port,Ec2_protocol,Wakame_host,Wakame_port,Wakame_protocol)
|
75
|
+
args = ARGV
|
76
|
+
end
|
77
|
+
|
78
|
+
if args.empty?
|
79
|
+
[:run_instances,:terminate_instances,:describe_instances,:describe_images,:describe_host_nodes,:describe_instance_specs].each { |method|
|
80
|
+
puts "Testing method: #{method}\n"
|
81
|
+
puts "Testing method: #{method}\n".gsub(/./) {|s| "-"}
|
82
|
+
p case method
|
83
|
+
when :run_instances then c.send(method,Image_id,Min,Max,Security_Groups,SSH_Key, User_Data, Addressing_Type, Instance_Type, nil, nil, HOST)
|
84
|
+
when :terminate_instances then c.send(method,Instances_to_terminate)
|
85
|
+
else c.send(method)
|
86
|
+
end
|
87
|
+
puts "\n"
|
88
|
+
}
|
89
|
+
elsif args[0] == "run_instances"
|
90
|
+
p c.run_instances(Image_id,Min,Max,Security_Groups,SSH_Key, User_Data, Addressing_Type, Instance_Type, nil, nil, HOST)
|
91
|
+
else
|
92
|
+
p c.send(args[0],args.slice(1..ARGV.length) || [])
|
93
|
+
end
|
data/test/calltama.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Arguments for Tama
|
2
|
+
Account: "a-shpoolxx"
|
3
|
+
|
4
|
+
Ec2_host: "192.168.2.22"
|
5
|
+
Ec2_port: "9005"
|
6
|
+
Ec2_protocol: "http"
|
7
|
+
|
8
|
+
Wakame_host: "192.168.2.22"
|
9
|
+
Wakame_port: "9001"
|
10
|
+
Wakame_protocol: "http"
|
11
|
+
|
12
|
+
#Put the instances you want to terminate in this array
|
13
|
+
Instances_to_terminate: []
|
14
|
+
|
15
|
+
#Arguments for run_instances
|
16
|
+
Image_id: 'wmi-lucid5'
|
17
|
+
Min: 1
|
18
|
+
Max: 1
|
19
|
+
Security_Groups: ['sg-demofgr']#['default', 'joske', 'jefke']
|
20
|
+
#Security_Groups: ['jefke']
|
21
|
+
SSH_Key: 'ssh-demo'
|
22
|
+
User_Data: 'joske'
|
23
|
+
Addressing_Type: 'public'
|
24
|
+
Instance_Type: 'is-demospec'
|
25
|
+
HOST: 'hn-demo1'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
load_path = "#{File.expand_path(File.dirname(__FILE__))}/.."
|
2
|
+
$LOAD_PATH.unshift(load_path) unless $LOAD_PATH.include?(load_path)
|
3
|
+
|
4
|
+
require 'tama'
|
5
|
+
|
6
|
+
c = Tama::Tama.new(:test)
|
7
|
+
|
8
|
+
[:run_instances,:terminate_instances,:describe_instances,:describe_images,:describe_host_nodes,:describe_instance_specs].each { |method|
|
9
|
+
puts "Testing method: #{method}\n"
|
10
|
+
puts "Testing method: #{method}\n".gsub(/./) {|s| "-"}
|
11
|
+
p c.send(method)
|
12
|
+
puts "\n"
|
13
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Api parameters
|
2
|
+
Account: "a-shpoolxx"
|
3
|
+
|
4
|
+
Ec2_host: "192.168.2.22"
|
5
|
+
Ec2_port: "9005"
|
6
|
+
Ec2_protocol: "http"
|
7
|
+
|
8
|
+
Wakame_host: "192.168.2.22"
|
9
|
+
Wakame_port: "9001"
|
10
|
+
Wakame_protocol: "http"
|
11
|
+
|
12
|
+
# Run_instance parameters
|
13
|
+
Image_id: 'wmi-lucid0'
|
14
|
+
Min: 2
|
15
|
+
Max: 3
|
16
|
+
Security_Groups:
|
17
|
+
sg-demofgr: 'default'
|
18
|
+
#ng-5ltkiagj: 'joske'
|
19
|
+
#ng-cxiouozg: 'jefke'
|
20
|
+
SSH_Key: 'ssh-demo'
|
21
|
+
User_Data: 'joske'
|
22
|
+
Addressing_Type: 'public'
|
23
|
+
Instance_Type: 'is-demospec'
|
24
|
+
HOST: 'hn-demo1'
|
25
|
+
|
26
|
+
describe_host_nodes:
|
27
|
+
[hn-demo1]
|
28
|
+
describe_instance_specs:
|
29
|
+
[is-demo2, is-demospec]
|
30
|
+
describe_images:
|
31
|
+
[wmi-lucid0, wmi-lucid1, wmi-lucid5, wmi-lucid6]
|
@@ -0,0 +1,39 @@
|
|
1
|
+
load_path = "#{File.expand_path(File.dirname(__FILE__))}/../../lib"
|
2
|
+
$LOAD_PATH.unshift(load_path) unless $LOAD_PATH.include?(load_path)
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
require 'tama'
|
6
|
+
|
7
|
+
require 'yaml'
|
8
|
+
config = YAML.load_file File.expand_path('../config.yml', __FILE__)
|
9
|
+
|
10
|
+
describe "TamaController" do
|
11
|
+
tama = Tama::Tama.new(config["Account"],config["Ec2_host"],config["Ec2_port"],config["Ec2_protocol"],config["Wakame_host"],config["Wakame_port"],config["Wakame_protocol"])
|
12
|
+
res = tama.run_instances(config["Image_id"],config["Min"],config["Max"],config["Security_Groups"].keys,config["SSH_Key"], config["User_Data"], config["Addressing_Type"], config["Instance_Type"], nil, nil, config["HOST"])
|
13
|
+
|
14
|
+
describe "run_instances" do
|
15
|
+
it_should_behave_like "run_instances", res, config
|
16
|
+
it_should_behave_like "run_instances return values", res, config
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "describe_instances" do
|
20
|
+
@desc_res = tama.describe_instances(res.map{|i| i[:aws_instance_id]})
|
21
|
+
it_should_behave_like "run_instances return values", @desc_res, config
|
22
|
+
it_should_behave_like "describe_instances return values", @desc_res, config
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "terminate_instances" do
|
26
|
+
@uuids = res.map{|i| i[:aws_instance_id]}
|
27
|
+
it_should_behave_like "terminate_instances", tama, @uuids
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "describe_images" do
|
31
|
+
it_should_behave_like "describe_images", tama, config["describe_images"]
|
32
|
+
end
|
33
|
+
|
34
|
+
[:describe_host_nodes,:describe_instance_specs].each { |method|
|
35
|
+
describe "#{method}" do
|
36
|
+
it_should_behave_like "wakame describe method", tama, method, config[method.to_s]
|
37
|
+
end
|
38
|
+
}
|
39
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rspec'
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
|
6
|
+
shared_examples_for "run_instances" do |result,args|
|
7
|
+
it "Should have started a number of instances between #{args["Min"]} and #{args["Max"]}" do
|
8
|
+
result.length.should >= args["Min"]
|
9
|
+
result.length.should <= args["Max"]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
shared_examples_for "run_instances return values" do |result,args|
|
14
|
+
result.each { |inst_map|
|
15
|
+
it "#{inst_map[:aws_instance_id]} should have a proper time value set for :aws_launch_time" do
|
16
|
+
Time.parse(inst_map[:aws_launch_time]).utc.xmlschema == inst_map[:aws_launch_time]
|
17
|
+
end
|
18
|
+
|
19
|
+
it "#{inst_map[:aws_instance_id]} should have #{args["Account"]} set as :aws_owner" do
|
20
|
+
inst_map[:aws_owner].should == args["Account"]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "#{inst_map[:aws_instance_id]} should have #{args["Security_Groups"].keys.inspect} set as :aws_groups" do
|
24
|
+
inst_map[:aws_groups].sort.should == args["Security_Groups"].keys.sort
|
25
|
+
end
|
26
|
+
|
27
|
+
it "#{inst_map[:aws_instance_id]} should have 0 set as :aws_state_code" do
|
28
|
+
inst_map[:aws_state_code].should == 0
|
29
|
+
end
|
30
|
+
|
31
|
+
it "#{inst_map[:aws_instance_id]} should have #{args["Image_id"]} set as :aws_image_id" do
|
32
|
+
inst_map[:aws_image_id].should == args["Image_id"]
|
33
|
+
end
|
34
|
+
|
35
|
+
it "#{inst_map[:aws_instance_id]} should have #{args["Instance_Type"]} set as :aws_instance_type" do
|
36
|
+
inst_map[:aws_instance_type].should == args["Instance_Type"]
|
37
|
+
end
|
38
|
+
|
39
|
+
#it "#{inst_map[:aws_instance_id]} should have one of #{possible_states.join(",")} set as :aws_state" do
|
40
|
+
|
41
|
+
#end
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
shared_examples_for "describe_instances return values" do |result,args|
|
46
|
+
before(:all) do
|
47
|
+
@uuids = result.map {|i| i[:aws_instance_id]}
|
48
|
+
end
|
49
|
+
|
50
|
+
result.each { |inst_map|
|
51
|
+
#it "#{inst_map[:aws_instance_id]} should have #{args["HOST"]} set as :aws_availability_zone" do
|
52
|
+
#inst_map[:aws_availablity_zone].should == args["HOST"]
|
53
|
+
#end
|
54
|
+
|
55
|
+
it "#{inst_map[:aws_instance_id]} should have #{args["SSH_Key"]} set as :ssh_key_name" do
|
56
|
+
inst_map[:ssh_key_name].should == args["SSH_Key"]
|
57
|
+
end
|
58
|
+
|
59
|
+
#it "#{inst_map[:aws_instance_id]} should have #{args[:arch]} set as :architecture" do
|
60
|
+
#inst_map[:architecture].should == args[:arch]
|
61
|
+
#end
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
shared_examples_for "terminate_instances" do |tama,uuids|
|
66
|
+
it "should terminate instances #{uuids.join(",")}" do
|
67
|
+
res = tama.terminate_instances(uuids)
|
68
|
+
|
69
|
+
res.length.should == uuids.length
|
70
|
+
res.map {|i| i[:aws_instance_id]}.sort.should == uuids.sort
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
shared_examples_for "describe_images" do |tama,ids|
|
75
|
+
it "should describe all images" do
|
76
|
+
res = tama.describe_images
|
77
|
+
res.class.should == Array
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should describe #{ids.join(",")}" do
|
81
|
+
res = tama.describe_images(ids)
|
82
|
+
res.length.should == ids.length
|
83
|
+
res.map {|img| img[:aws_id]}.sort.should == ids.sort
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
shared_examples_for "wakame describe method" do |tama,method_name,ids|
|
88
|
+
it "should describe all" do
|
89
|
+
res = tama.send(method_name)
|
90
|
+
res.nil?.should be_false
|
91
|
+
res.class.should == Array
|
92
|
+
#res.empty?.should be_false
|
93
|
+
#res.first["results"].class.should == Array
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should describe #{ids.join(",")}" do
|
97
|
+
res = tama.send(method_name,ids)
|
98
|
+
res.length.should == ids.length
|
99
|
+
res.map {|node| node["uuid"]}.sort.should == ids.sort
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"owner_total": 4,
|
4
|
+
"start": 0,
|
5
|
+
"results": [
|
6
|
+
{
|
7
|
+
"updated_at": "2011-10-18T03:53:37Z",
|
8
|
+
"account_id": "a-shpoolxx",
|
9
|
+
"boot_dev_type": 1,
|
10
|
+
"description": "ubuntu-10.04_with-metadata_kvm_i386.raw volume",
|
11
|
+
"source": "--- \n:snapshot_id: snap-lucid6\n",
|
12
|
+
"state": "init",
|
13
|
+
"arch": "x86",
|
14
|
+
"is_public": false,
|
15
|
+
"created_at": "2011-10-18T03:53:37Z",
|
16
|
+
"uuid": "wmi-lucid6",
|
17
|
+
"id": "wmi-lucid6",
|
18
|
+
"md5sum": "8e0d8d37d704751a076fdf704a311350"
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"updated_at": "2011-10-18T03:53:36Z",
|
22
|
+
"account_id": "a-shpoolxx",
|
23
|
+
"boot_dev_type": 2,
|
24
|
+
"description": "ubuntu-10.04_with-metadata_kvm_i386.raw local",
|
25
|
+
"source": "--- \n:uri: file:///home/wakame/work/wakame-vdc/tmp/images/ubuntu-10.04_with-metadata_kvm_i386.raw\n",
|
26
|
+
"state": "init",
|
27
|
+
"arch": "x86",
|
28
|
+
"is_public": false,
|
29
|
+
"created_at": "2011-10-18T03:53:36Z",
|
30
|
+
"uuid": "wmi-lucid5",
|
31
|
+
"id": "wmi-lucid5",
|
32
|
+
"md5sum": "8e0d8d37d704751a076fdf704a311350"
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"updated_at": "2011-10-18T03:53:35Z",
|
36
|
+
"account_id": "a-shpoolxx",
|
37
|
+
"boot_dev_type": 1,
|
38
|
+
"description": "ubuntu-10.04_without-metadata_kvm_i386.raw volume",
|
39
|
+
"source": "--- \n:snapshot_id: snap-lucid1\n",
|
40
|
+
"state": "init",
|
41
|
+
"arch": "x86",
|
42
|
+
"is_public": false,
|
43
|
+
"created_at": "2011-10-18T03:53:35Z",
|
44
|
+
"uuid": "wmi-lucid1",
|
45
|
+
"id": "wmi-lucid1",
|
46
|
+
"md5sum": "8b2a8fb606f5b6ceeca11d9f71e034a8"
|
47
|
+
},
|
48
|
+
{
|
49
|
+
"updated_at": "2011-10-18T03:53:35Z",
|
50
|
+
"account_id": "a-shpoolxx",
|
51
|
+
"boot_dev_type": 2,
|
52
|
+
"description": "ubuntu-10.04_without-metadata_kvm_i386.raw local",
|
53
|
+
"source": "--- \n:uri: file:///home/wakame/work/wakame-vdc/tmp/images/ubuntu-10.04_without-metadata_kvm_i386.raw\n",
|
54
|
+
"state": "init",
|
55
|
+
"arch": "x86",
|
56
|
+
"is_public": false,
|
57
|
+
"created_at": "2011-10-18T03:53:35Z",
|
58
|
+
"uuid": "wmi-lucid0",
|
59
|
+
"id": "wmi-lucid0",
|
60
|
+
"md5sum": "8b2a8fb606f5b6ceeca11d9f71e034a8"
|
61
|
+
}
|
62
|
+
],
|
63
|
+
"limit": null
|
64
|
+
}
|
65
|
+
]
|