add_fixed_ip(server_id, network_id)
click to toggle source
def add_fixed_ip(server_id, network_id)
true
end
add_flavor_access(flavor_ref, tenant_id)
click to toggle source
def add_flavor_access(flavor_ref, tenant_id)
response = Excon::Response.new
response.status = 200
response.body = {
"flavor_access" => [{ "tenant_id" => tenant_id.to_s, "flavor_id" => flavor_ref.to_s }]
}
response
end
allocate_address(pool = nil)
click to toggle source
def allocate_address(pool = nil)
response = Excon::Response.new
response.status = 200
response.headers = {
"X-Compute-Request-Id" => "req-d4a21158-a86c-44a6-983a-e25645907f26",
"Content-Type" => "application/json",
"Content-Length" => "105",
"Date"=> Date.new
}
response.body = {
"floating_ip" => {
"instance_id" => nil,
"ip" => "192.168.27.132",
"fixed_ip" => nil,
"id" => 4,
"pool"=>"nova"
}
}
response
end
associate_address(server_id, ip_address)
click to toggle source
def associate_address(server_id, ip_address)
response = Excon::Response.new
response.status = 202
response.headers = {
"Content-Type" => "text/html, charset=UTF-8",
"Content-Length" => "0",
"Date"=> Date.new
}
response
end
attach_volume(volume_id, server_id, device)
click to toggle source
def attach_volume(volume_id, server_id, device)
response = Excon::Response.new
response.status = 200
data = {
'id' => volume_id,
'volumeId' => volume_id,
'serverId' => server_id,
'device' => device
}
self.data[:volumes][volume_id]['attachments'] << data
response.body = { 'volumeAttachment' => data }
response
end
change_server_password(server_id, admin_password)
click to toggle source
def change_server_password(server_id, admin_password)
response = Excon::Response.new
response.status = 202
response
end
confirm_resize_server(server_id)
click to toggle source
def confirm_resize_server(server_id)
response = Excon::Response.new
response.status = 204
response
end
create_flavor(attributes)
click to toggle source
def create_flavor(attributes)
response = Excon::Response.new
response.status = 200
response.headers = {
"X-Compute-Request-Id" => "req-fdc6f99e-55a2-4ab1-8904-0892753828cf",
"Content-Type" => "application/json",
"Content-Length" => "356",
"Date" => Date.new
}
response.body = {
"flavor" => {
"vcpus" => attributes[:vcpus],
"disk" => attributes[:disk],
"name" => attributes[:name],
"links" => [
{
"href" => "http://192.168.27.100:8774/v1.1/6733e93c5f5c4eb1bcabc6902ba208d6/flavors/11",
"rel" => "self"
},
{
"href" => "http://192.168.27.100:8774/6733e93c5f5c4eb1bcabc6902ba208d6/flavors/11",
"rel" => "bookmark"
}
],
"rxtx_factor" => attributes[:rxtx_factor] || 1.0,
"OS-FLV-EXT-DATA:ephemeral" => attributes[:ephemeral] || 0,
"os-flavor-access:is_public" => attributes[:is_public] || false,
"OS-FLV-DISABLED:disabled" => attributes[:disabled] || false,
"ram" => attributes[:ram],
"id" => "11",
"swap" => attributes[:swap] || ""
}
}
response
end
create_image(server_id, name, metadata={})
click to toggle source
def create_image(server_id, name, metadata={})
response = Excon::Response.new
response.status = 202
img_id=Fog::Mock.random_numbers(6).to_s
data = {
'id' => img_id,
'server' => {"id"=>"3", "links"=>[{"href"=>"http://nova1:8774/admin/servers/#{server_id}", "rel"=>"bookmark"}]},
'links' => [{"href"=>"http://nova1:8774/v1.1/admin/images/#{img_id}", "rel"=>"self"}, {"href"=>"http://nova1:8774/admin/images/#{img_id}", "rel"=>"bookmark"}],
'metadata' => metadata || {},
'name' => name || "server_#{rand(999)}",
'progress' => 0,
'status' => 'SAVING',
'minDisk' => 0,
'minRam' => 0,
'updated' => "",
'created' => ""
}
self.data[:last_modified][:images][data['id']] = Time.now
self.data[:images][data['id']] = data
response.body = { 'image' => data }
response
end
create_key_pair(key_name, public_key = nil)
click to toggle source
def create_key_pair(key_name, public_key = nil)
response = Excon::Response.new
response.status = 200
response.headers = {
"X-Compute-Request-Id" => "req-c373a42c-2825-4e60-8d34-99416ea850be",
"Content-Type" => "application/json",
"Content-Length" => "1289",
"Date" => Date.new}
response.body = {
"keypair" => {
"public_key" => "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDCdAZLjljntJbLVVkNHjWFSoKen2nZbk39ZfqhZJOMdeFdz02GWBS45rcuboeGg/gozKRwsLu4N6NLPlYtbK/NapJIvgO/djBp+FQG1QZNtLPsx7j4hVJac3yISGms+Xtu4cEv6j5sFDzAgTQbWez0Z1+9qOq9ngdaoW+YClfQ== vagrant@nova\n",
"private_key" => "-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKBgQDCdAZLjljn1tJbLVVkNHjWFSoKen2nZbk39ZfqhZJOMdeFdz02\nGWBS45rcuHboeGg/gozKRwsLu4N6NLPlYtbK/NapJIvgO/djBp+FQG1QZNtLPsx7\nj4hVJac3yISGms+Xtu4cEv6j5sFDzAgTQbWez0Z1+9qOq9ngdaoW+YClfQIDAQAB\nAoGBALBoT9m1vuQ82EONQf2RONqHAsfUzi/SMhEZRgOlv9AemXZkcWyl4uPvxmtd\nEcreiTystAtCHjw7lhCExXthipevUjtIAAt+b3pMn6Oyjad3IRvde6atMdjrje43\n/nftYtuXYyJTsvwEvLYqSioLQ0Nn/XDKhOpcM5tejDHOH35lAkEA+H4r7y9X521u\nIABVAezBWaT/wvdMjx5cwfyYEQjnI1bxfRIqkgoY5gDDBdVbT75UTsHHbHLORQcw\nRjRvS2zgewJBAMhT6eyMonJvHHvC5RcchcY+dWkscIKoOzeyUKMb+7tERQa9/UN2\njYb+jdM0VyL0ruLFwYtl2m34gfmhcXgIvGcCQGzKMEnjHEUBr7jq7EyPbobkqeSd\niDMQQ+PZxmmO0EK0ib0L+v881HG926PuKK/cz+Q7Cif8iznFT+ksg50t6YkCQQC9\nwfcAskqieSuS9A9LcCIrojhXctf0e+T0Ij2N89DlF4sHEuqXf/IZ4IB5gsfTfdE3\nUDnAkK9yogaEbu/r0uKbAkEAy5kl71bIqvKTKsY2mES9ziVxfftl/9UIi5LI+QHb\nmC/c6cTrGVCM71fi2GMxGgBeEea4+7xwoWTL4CxA00kmTg==\n-----END RSA PRIVATE KEY-----\n",
"user_id" => "admin",
"name" => key_name,
"fingerprint" => "97:86:f4:15:68:0c:7b:a7:e5:8f:f0:bd:1f:27:65:ad"
}
}
response
end
create_security_group(name, description)
click to toggle source
def create_security_group(name, description)
Fog::Identity.new(:provider => 'OpenStack')
tenant_id = Fog::Identity::OpenStack::Mock.data[current_tenant][:tenants].keys.first
security_group_id = Fog::Mock.random_numbers(2).to_i
self.data[:security_groups][security_group_id] = {
'tenant_id' => tenant_id,
'rules' => [],
'id' => security_group_id,
'name' => name,
'description' => description
}
response = Excon::Response.new
response.status = 200
response.headers = {
'X-Compute-Request-Id' => "req-#{Fog::Mock.random_hex(32)}",
'Content-Type' => 'application/json',
'Content-Length' => Fog::Mock.random_numbers(3).to_s,
'Date' => Date.new}
response.body = {
'security_group' => self.data[:security_groups][security_group_id]
}
response
end
create_security_group_rule(parent_group_id, ip_protocol, from_port, to_port, cidr, group_id=nil)
click to toggle source
def create_security_group_rule(parent_group_id, ip_protocol, from_port, to_port, cidr, group_id=nil)
parent_group_id = parent_group_id.to_i
response = Excon::Response.new
response.status = 200
response.headers = {
'X-Compute-Request-Id' => "req-#{Fog::Mock.random_hex(32)}",
'Content-Type' => 'application/json',
'Content-Length' => Fog::Mock.random_numbers(3).to_s,
'Date' => Date.new
}
rule = {
'id' => Fog::Mock.random_numbers(2).to_i,
'from_port' => from_port,
'group' => group_id || {},
'ip_protocol' => ip_protocol,
'to_port' => to_port,
'parent_group_id' => parent_group_id,
'ip_range' => {
'cidr' => cidr
}
}
self.data[:security_groups][parent_group_id]['rules'].push(rule)
response.body = {
'security_group_rule' => rule
}
response
end
create_server(name, image_ref, flavor_ref, options = {})
click to toggle source
def create_server(name, image_ref, flavor_ref, options = {})
response = Excon::Response.new
response.status = 202
server_id = Fog::Mock.random_numbers(6).to_s
identity = Fog::Identity[:openstack]
user = identity.users.find { |u|
u.name == @openstack_username
}
user_id = if user then
user.id
else
response = identity.create_user(@openstack_username,
'password',
"#{@openstack_username}@example.com")
response.body["user"]["id"]
end
mock_data = {
'addresses' => {},
'flavor' => {"id" => flavor_ref, "links"=>[{"href"=>"http://nova1:8774/admin/flavors/1", "rel"=>"bookmark"}]},
'id' => server_id,
'image' => {"id" => image_ref, "links"=>[{"href"=>"http://nova1:8774/admin/images/#{image_ref}", "rel"=>"bookmark"}]},
'links' => [{"href"=>"http://nova1:8774/v1.1/admin/servers/5", "rel"=>"self"}, {"href"=>"http://nova1:8774/admin/servers/5", "rel"=>"bookmark"}],
'hostId' => "123456789ABCDEF01234567890ABCDEF",
'metadata' => options['metadata'] || {},
'name' => name || "server_#{rand(999)}",
'accessIPv4' => options['accessIPv4'] || "",
'accessIPv6' => options['accessIPv6'] || "",
'progress' => 0,
'status' => 'BUILD',
'created' => '2012-09-27T00:04:18Z',
'updated' => '2012-09-27T00:04:27Z',
'user_id' => @openstack_username,
}
response_data = {
'adminPass' => 'password',
'id' => server_id,
'links' => mock_data['links'],
}
self.data[:last_modified][:servers][server_id] = Time.now
self.data[:servers][server_id] = mock_data
if security_groups = options['security_groups'] then
groups = Array(options['security_groups']).map do |sg|
if sg.is_a?(Fog::Compute::OpenStack::SecurityGroup) then
sg.name
else
sg
end
end
self.data[:server_security_group_map][server_id] = groups
response_data['security_groups'] = groups
end
self.data[:last_modified][:servers][server_id] = Time.now
self.data[:servers][server_id] = mock_data
response.body = { 'server' => response_data }
response
end
create_volume(name, description, size, options={})
click to toggle source
def create_volume(name, description, size, options={})
response = Excon::Response.new
response.status = 202
data = {
'id' => Fog::Mock.random_numbers(2),
'displayName' => name,
'displayDescription' => description,
'size' => size,
'status' => 'creating',
'snapshotId' => nil,
'volumeType' => 'None',
'availabilityZone' => 'nova',
'createdAt' => Time.now.strftime('%FT%T.%6N'),
'attachments' => [],
'metadata' => {}
}
self.data[:volumes][data['id']] = data
response.body = { 'volume' => data }
response
end
create_volume_snapshot(volume_id, name, description, force=false)
click to toggle source
def create_volume_snapshot(volume_id, name, description, force=false)
response = Excon::Response.new
response.status = 202
response.body = {
"snapshot"=> {
"status"=>"creating",
"display_name"=>name,
"created_at"=>Time.now,
"display_description"=>description,
"volume_id"=>volume_id,
"id"=>"5",
"size"=>1
}
}
response
end
credentials()
click to toggle source
def credentials
{ :provider => 'openstack',
:openstack_auth_url => @openstack_auth_uri.to_s,
:openstack_auth_token => @auth_token,
:openstack_management_url => @openstack_management_url,
:openstack_identity_endpoint => @openstack_identity_public_endpoint }
end
data()
click to toggle source
def data
self.class.data["#{@openstack_username}-#{@current_tenant}"]
end
delete_flavor(flavor_id)
click to toggle source
def delete_flavor(flavor_id)
response = Excon::Response.new
response.status = 202
response.headers = {
"Content-Type" => "text/html; charset=UTF-8",
"Content-Length" => "0",
"Date" => Date.new
}
response
end
delete_image(image_id)
click to toggle source
def delete_image(image_id)
response = Excon::Response.new
if image = list_images_detail.body['images'].detect {|_| _['id'] == image_id}
if image['status'] == 'SAVING'
response.status = 409
raise(Excon::Errors.status_error({:expects => 202}, response))
else
self.data[:last_modified][:images].delete(image_id)
self.data[:images].delete(image_id)
response.status = 202
end
response
else
response.status = 400
raise(Excon::Errors.status_error({:expects => 202}, response))
end
end
delete_key_pair(key_name)
click to toggle source
def delete_key_pair(key_name)
response = Excon::Response.new
response.status = 202
response.headers = {
"Content-Type" => "text/html; charset=UTF-8",
"Content-Length" => "0",
"Date" => Date.new
}
response.body = {}
response
end
delete_security_group(security_group_id)
click to toggle source
def delete_security_group(security_group_id)
self.data[:security_groups].delete security_group_id
response = Excon::Response.new
response.status = 202
response.headers = {
"Content-Type" => "text/html; charset=UTF-8",
"Content-Length" => "0",
"Date" => Date.new
}
response.body = {}
response
end
delete_security_group_rule(security_group_rule_id)
click to toggle source
def delete_security_group_rule(security_group_rule_id)
response = Excon::Response.new
response.status = 202
response.headers = {
"Content-Type" => "text/html; charset=UTF-8",
"Content-Length" => "0",
"Date" => Date.new
}
response.body = {}
response
end
delete_server(server_id)
click to toggle source
def delete_server(server_id)
response = Excon::Response.new
if server = list_servers_detail.body['servers'].detect {|_| _['id'] == server_id}
if server['status'] == 'BUILD'
response.status = 409
raise(Excon::Errors.status_error({:expects => 204}, response))
else
self.data[:last_modified][:servers].delete(server_id)
self.data[:servers].delete(server_id)
response.status = 204
end
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
delete_snapshot(snapshot_id)
click to toggle source
def delete_snapshot(snapshot_id)
response = Excon::Response.new
response.status = 204
response
end
delete_volume(volume_id)
click to toggle source
def delete_volume(volume_id)
response = Excon::Response.new
if list_volumes.body['volumes'].map { |v| v['id'] }.include? volume_id
self.data[:volumes].delete(volume_id)
response.status = 204
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
detach_volume(server_id, attachment_id)
click to toggle source
def detach_volume(server_id, attachment_id)
response = Excon::Response.new
if self.data[:volumes][attachment_id] &&
self.data[:volumes][attachment_id]['attachments'].reject! { |attachment| attachment['serverId'] == server_id }
response.status = 202
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
disassociate_address(server_id, ip_address)
click to toggle source
def disassociate_address(server_id, ip_address)
response = Excon::Response.new
response.status = 202
response.headers = {
"Content-Type" => "text/html, charset=UTF-8",
"Content-Length" => "0",
"Date"=> Date.new
}
response
end
get_address(address_id)
click to toggle source
def get_address(address_id)
response = Excon::Response.new
response.status = 200
response.headers = {
"X-Compute-Request-Id" => "req-d4a21158-a86c-44a6-983a-e25645907f26",
"Content-Type" => "application/json",
"Content-Length" => "105",
"Date"=> Date.new
}
response.body = {
"floating_ip" => {
"instance_id" => nil,
"ip" => "192.168.27.129",
"fixed_ip" => nil,
"id" => 1,
"pool" => "nova"
}
}
response
end
get_console_output(server_id, log_length)
click to toggle source
def get_console_output(server_id, log_length)
response = Excon::Response.new
response.status = 200
response
end
get_flavor_details(flavor_ref)
click to toggle source
def get_flavor_details(flavor_ref)
response = Excon::Response.new
flavor = {
'1' => { 'id' => '1', 'name' => '256 server', 'ram' => 256, 'disk' => 10, 'swap' => '1', 'vcpus' => 1, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
'2' => { 'id' => '2', 'name' => '512 server', 'ram' => 512, 'disk' => 20, 'swap' => '1', 'vcpus' => 2, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
'3' => { 'id' => '3', 'name' => '1GB server', 'ram' => 1024, 'disk' => 40, 'swap' => '2', 'vcpus' => 2, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
'4' => { 'id' => '4', 'name' => '2GB server', 'ram' => 2048, 'disk' => 80, 'swap' => '4', 'vcpus' => 4, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
'5' => { 'id' => '5', 'name' => '4GB server', 'ram' => 4096, 'disk' => 160, 'swap' => '8', 'vcpus' => 8, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
'6' => { 'id' => '6', 'name' => '8GB server', 'ram' => 8192, 'disk' => 320, 'swap' => '16', 'vcpus' => 16, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
'7' => { 'id' => '7', 'name' => '15.5GB server', 'ram' => 15872, 'disk' => 620, 'swap' => '32', 'vcpus' => 32, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] }
}[flavor_ref]
if flavor
response.status = 200
response.body = {
'flavor' => flavor
}
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
get_host_details(host)
click to toggle source
def get_host_details(host)
response = Excon::Response.new
response.status = 200
response.body = { "host" => [
{ "resource" => {
"project" => "(total)",
"memory_mb" => 64427,
"host" => "cn28.la-1-3.morphcloud.net",
"cpu" => 12,
"disk_gb" => 1608
}
},
{ "resource" => {
"project" => "(used_now)",
"memory_mb" => 1753,
"host" => "cn28.la-1-3.morphcloud.net",
"cpu" => 3,
"disk_gb" => 33
}
},
{ "resource" => {
"project" => "(used_max)",
"memory_mb" => 7168,
"host" => "cn28.la-1-3.morphcloud.net",
"cpu" => 3,
"disk_gb" => 45
}
},
{ "resource" => {
"project" => "bf8301f5164f4790889a1bc2bfb16d99",
"memory_mb" => 5120,
"host" => "cn28.la-1-3.morphcloud.net",
"cpu" => 2,
"disk_gb" => 35
}
},
{ "resource" => {
"project" => "3bb4d0301c5f47d5b4d96a361fcf96f4",
"memory_mb" => 2048,
"host" => "cn28.la-1-3.morphcloud.net",
"cpu" => 1,
"disk_gb" => 10
}
}
]
}
response
end
get_image_details(image_id)
click to toggle source
def get_image_details(image_id)
response = Excon::Response.new
if image = list_images_detail.body['images'].detect {|_| _['id'] == image_id}
response.status = [200, 203][rand(1)]
response.body = { 'image' => image }
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
get_limits()
click to toggle source
def get_limits
rate_limits = [
{ 'regex' => '.*',
'limit' => [
{ 'next-available' => '2012-11-22T16:13:44Z',
'unit' => 'MINUTE',
'verb' => 'POST',
'remaining' => 9,
'value' => 10 },
{ 'next-available' => '2012-11-23T00:46:14Z',
'unit' => 'MINUTE',
'verb' => 'PUT',
'remaining' => 10,
'value' => 10 },
{ 'next-available' => '2012-11-22T16:14:30Z',
'unit' => 'MINUTE',
'verb' => 'DELETE',
'remaining' => 99,
'value' => 100 } ],
'uri' => '*' },
{ 'regex' => '^/servers',
'limit' => [
{ 'next-available' => '2012-11-23T00:46:14Z',
'unit' => 'DAY',
'verb' => 'POST',
'remaining' => 50,
'value' => 50} ],
'uri'=>'*/servers' },
{ 'regex' => '.*changes-since.*',
'limit' => [
{ 'next-available' => '2012-11-23T00:46:14Z',
'unit' => 'MINUTE',
'verb' => 'GET',
'remaining' => 3,
'value' => 3 } ],
'uri' => '*changes-since*' }
]
absolute_limits = {
'maxServerMeta' => 128,
'maxTotalInstances' => 10,
'maxPersonality' => 5,
'maxImageMeta' => 128,
'maxPersonalitySize' => 10240,
'maxSecurityGroupRules' => 20,
'maxTotalKeypairs' => 100,
'maxSecurityGroups' => 10,
'maxTotalCores' => 20,
'maxTotalFloatingIps' => 10,
'maxTotalRAMSize' => 51200,
'totalCoresUsed' => -1,
'totalRAMUsed' => -2048,
'totalInstancesUsed' => -1,
'totalSecurityGroupsUsed' => 0,
'totalFloatingIpsUsed' => 0
}
Excon::Response.new(
:status => 200,
:body => {
'limits' => {
'rate' => rate_limits,
'absolute' => absolute_limits }
}
)
end
get_quota(tenant_id)
click to toggle source
def get_quota(tenant_id)
response = Excon::Response.new
response.status = 200
response.body = {
'quota_set' => (self.data[:quota_updated] or self.data[:quota]).merge({'id' => tenant_id})
}
response
end
get_quota_defaults(tenant_id)
click to toggle source
def get_quota_defaults(tenant_id)
response = Excon::Response.new
response.status = 200
response.body = {
'quota_set' => self.data[:quota].merge({'id' => tenant_id})
}
response
end
get_security_group(security_group_id)
click to toggle source
def get_security_group(security_group_id)
response = Excon::Response.new
response.status = 200
response.headers = {
"X-Compute-Request-Id" => "req-63a90344-7c4d-42e2-936c-fd748bced1b3",
"Content-Type" => "application/json",
"Content-Length" => "167",
"Date" => Date.new
}
response.body = {
"security_group" => {
"rules" => [{
"from_port" => 44,
"group" => {},
"ip_protocol" => "tcp",
"to_port" => 55,
"parent_group_id" => 1,
"ip_range" => {
"cidr" => "10.10.10.10/24"
}, "id"=>1
}],
"tenant_id" => "d5183375ab0343f3a0b4b05f547aefc2",
"id"=>security_group_id,
"name"=>"default",
"description"=>"default"
}
}
response
end
get_server_details(server_id)
click to toggle source
def get_server_details(server_id)
response = Excon::Response.new
if server = list_servers_detail.body['servers'].detect {|_| _['id'] == server_id}
response.status = [200, 203][rand(1)]
response.body = { 'server' => server }
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
get_server_volumes(server_id)
click to toggle source
def get_server_volumes(server_id)
response = Excon::Response.new
response.status = 200
data = self.data[:volumes].values.find_all do |vol|
vol['attachments'].find { |attachment| attachment["serverId"] == server_id }
end
response.body = { 'volumeAttachments' => data.collect! { |vol| vol['attachments'] }.flatten(1) }
response
end
get_snapshot_details(snapshot_id)
click to toggle source
def get_snapshot_details(snapshot_id)
response = Excon::Response.new
response.status = 200
response.body = {
'snapshot' => {
'id' => '1',
'display_name' => Fog::Mock.random_letters(rand(8) + 5),
'display_description' => Fog::Mock.random_letters(rand(12) + 10),
'size' => 3,
'volume_id' => '4',
'status' => 'online',
'created_at' => Time.now
}
}
response
end
get_usage(tenant_id, date_start, date_end)
click to toggle source
def get_usage(tenant_id, date_start, date_end)
response = Excon::Response.new
response.status = 200
response.body = {"tenant_usage"=>
{"total_memory_mb_usage" => 0.0,
"total_vcpus_usage" => 0.0,
"total_hours" => 0.0,
"tenant_id" => tenant_id,
"stop" => date_start,
"start" => date_end,
"total_local_gb_usage" => 0.0,
"server_usages" =>[{
"hours" => 0.0,
"uptime" => 69180,
"local_gb" => 0,
"ended_at" => nil,
"name" => "test server",
"tenant_id" => tenant_id,
"vcpus" => 1,
"memory_mb" => 512,
"state" => "active",
"flavor" => "m1.tiny",
"started_at" => "2012-03-05 09:11:44"
}
]
}
}
response
end
get_vnc_console(server_id, console_type)
click to toggle source
def get_vnc_console(server_id, console_type)
response = Excon::Response.new
response.status = 200
response.body = {
"console" => {
"url" => "http://192.168.27.100:6080/vnc_auto.html?token=c3606020-d1b7-445d-a88f-f7af48dd6a20",
"type" => "novnc"
}
}
response
end
get_volume_details(volume_id)
click to toggle source
def get_volume_details(volume_id)
response = Excon::Response.new
if data = self.data[:volumes][volume_id]
response.status = 200
response.body = { 'volume' => data }
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
list_address_pools()
click to toggle source
def list_address_pools
response = Excon::Response.new
response.status = 200
response.body = {
'floating_ip_pools' => [
{ 'name' => 'nova' }
]
}
response
end
list_addresses(server_id)
click to toggle source
def list_addresses(server_id)
response = Excon::Response.new
if server = list_servers_detail.body['servers'].detect {|_| _['id'] == server_id}
response.status = [200, 203][rand(1)]
response.body = { 'addresses' => server['addresses'] }
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
list_all_addresses()
click to toggle source
def list_all_addresses
response = Excon::Response.new
response.status = 200
response.headers = {
"X-Compute-Request-Id" => "req-d4a21158-a86c-44a6-983a-e25645907f26",
"Content-Type" => "application/json",
"Content-Length" => "378",
"Date"=> Date.new
}
response.body = {
"floating_ips" => [
{
"instance_id" => nil,
"ip" => "192.168.27.129",
"fixed_ip" => nil,
"id" => 1,
"pool" => "nova"
},
{
"instance_id" => nil,
"ip" => "192.168.27.130",
"fixed_ip" => nil,
"id" => 2,
"pool" => "nova"
},
{
"instance_id" => nil,
"ip" => "192.168.27.131",
"fixed_ip" => nil,
"id" => 3,
"pool" => "nova"
},
{
"instance_id" => nil,
"ip" => "192.168.27.132",
"fixed_ip" => nil,
"id" => 4,
"pool" => "nova"
}
]
}
response
end
list_flavors()
click to toggle source
def list_flavors
response = Excon::Response.new
response.status = 200
response.body = {
'flavors' => [
{ 'name' => '256 server', 'id' => '1', 'links' => ['https://itdoesntmatterwhatshere.heh'] },
{ 'name' => '512 server', 'id' => '2', 'links' => ['https://itdoesntmatterwhatshere.heh'] },
{ 'name' => '1GB server', 'id' => '3', 'links' => ['https://itdoesntmatterwhatshere.heh'] },
{ 'name' => '2GB server', 'id' => '4', 'links' => ['https://itdoesntmatterwhatshere.heh'] },
{ 'name' => '4GB server', 'id' => '5', 'links' => ['https://itdoesntmatterwhatshere.heh'] },
{ 'name' => '8GB server', 'id' => '6', 'links' => ['https://itdoesntmatterwhatshere.heh'] },
{ 'name' => '15.5GB server', 'id' => '7', 'links' => ['https://itdoesntmatterwhatshere.heh'] }
]
}
response
end
list_flavors_detail(options = {})
click to toggle source
def list_flavors_detail(options = {})
response = Excon::Response.new
response.status = 200
response.body = {
'flavors' => [
{ 'id' => '1', 'name' => '256 server', 'ram' => 256, 'disk' => 10, 'swap' => '1', 'vcpus' => 1, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
{ 'id' => '2', 'name' => '512 server', 'ram' => 512, 'disk' => 20, 'swap' => '1', 'vcpus' => 2, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
{ 'id' => '3', 'name' => '1GB server', 'ram' => 1024, 'disk' => 40, 'swap' => '2', 'vcpus' => 2, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
{ 'id' => '4', 'name' => '2GB server', 'ram' => 2048, 'disk' => 80, 'swap' => '4', 'vcpus' => 4, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
{ 'id' => '5', 'name' => '4GB server', 'ram' => 4096, 'disk' => 160, 'swap' => '8', 'vcpus' => 8, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
{ 'id' => '6', 'name' => '8GB server', 'ram' => 8192, 'disk' => 320, 'swap' => '16', 'vcpus' => 16, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] },
{ 'id' => '7', 'name' => '15.5GB server', 'ram' => 15872, 'disk' => 620, 'swap' => '32', 'vcpus' => 32, 'OS-FLV-EXT-DATA:ephemeral' => 1, 'links' => [] }
]
}
response
end
list_hosts()
click to toggle source
def list_hosts
response = Excon::Response.new
response.status = 200
response.body = { "hosts" => [
{"host_name" => "host.test.net", "service"=>"compute"}
]
}
response
end
list_images()
click to toggle source
def list_images
response = Excon::Response.new
data = list_images_detail.body['images']
images = []
for image in data
images << image.reject { |key, value| !['id', 'name', 'links'].include?(key) }
end
response.status = [200, 203][rand(1)]
response.body = { 'images' => images }
response
end
list_images_detail()
click to toggle source
def list_images_detail
response = Excon::Response.new
images = self.data[:images].values
for image in images
case image['status']
when 'SAVING'
if Time.now - self.data[:last_modified][:images][image['id']] >= Fog::Mock.delay
image['status'] = 'ACTIVE'
end
end
end
response.status = [200, 203][rand(1)]
response.body = { 'images' => images.map {|image| image.reject {|key, value| !['id', 'name', 'links', 'minRam', 'minDisk', 'metadata', 'status', 'updated'].include?(key)}} }
response
end
list_key_pairs()
click to toggle source
def list_key_pairs
response = Excon::Response.new
response.status = 200
response.headers = {
"X-Compute-Request-Id" => "req-c373a42c-2825-4e60-8d34-99416ea850be",
"Content-Type" => "application/json",
"Content-Length" => "360",
"Date" => Date.new}
response.body = {
"keypairs" => [{
"keypair" => {
"public_key" => "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDCdAZLjln1tJbLVVkNHjWFSoKen2nZbk39ZfqhZJOMdeFdz02GWBS4rcuHboeGg/gozKRwsLu4N6NLPlYtbK/NapJIvgO/djBp+FG1QZNtLPsx7j4hVJac3yISGms+Xtu4cEv6j5sFDzAgTQbWz0Z1+9qOq9ngdaoW+YClfQ== vagrant@nova\n",
"name" => "test_key",
"fingerprint" => "97:86:f4:15:68:0c:7b:a7:e5:8f:f0:bd:1f:27:65:ad"
}
}]
}
response
end
list_private_addresses(server_id)
click to toggle source
def list_private_addresses(server_id)
response = Excon::Response.new
if server = list_servers_detail.body['servers'].detect {|_| _['id'] == server_id}
response.status = [200, 203][rand(1)]
response.body = { 'private' => server['addresses']['private'] }
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
list_public_addresses(server_id)
click to toggle source
def list_public_addresses(server_id)
response = Excon::Response.new
if server = list_servers_detail.body['servers'].detect {|_| _['id'] == server_id}
response.status = [200, 203][rand(1)]
response.body = { 'public' => server['addresses']['public'] }
response
else
raise Fog::Compute::OpenStack::NotFound
end
end
list_security_groups(server_id = nil)
click to toggle source
def list_security_groups(server_id = nil)
security_groups = self.data[:security_groups].values
groups = if server_id then
server_group_names =
Array(self.data[:server_security_group_map][server_id])
server_group_names.map do |name|
security_groups.find do |sg|
sg['name'] == name
end
end.compact
else
security_groups
end
Excon::Response.new(
:body => { 'security_groups' => groups },
:headers => {
"X-Compute-Request-Id" => "req-#{Fog::Mock.random_base64(36)}",
"Content-Type" => "application/json",
"Date" => Date.new
},
:status => 200
)
end
list_servers(options = {})
click to toggle source
def list_servers(options = {})
response = Excon::Response.new
data = list_servers_detail.body['servers']
servers = []
for server in data
servers << server.reject { |key, value| !['id', 'name', 'links'].include?(key) }
end
response.status = [200, 203][rand(1)]
response.body = { 'servers' => servers }
response
end
list_servers_detail(filters = {})
click to toggle source
def list_servers_detail(filters = {})
response = Excon::Response.new
servers = self.data[:servers].values
for server in servers
case server['status']
when 'BUILD'
if Time.now - self.data[:last_modified][:servers][server['id']] > Fog::Mock.delay * 2
server['status'] = 'ACTIVE'
end
end
end
response.status = [200, 203][rand(1)]
response.body = { 'servers' => servers }
response
end
list_snapshots(detailed=true)
click to toggle source
def list_snapshots(detailed=true)
response = Excon::Response.new
response.status = 200
response.body = {
'snapshots' => [get_snapshot_details.body["snapshot"]]
}
response
end
list_tenants()
click to toggle source
def list_tenants
response = Excon::Response.new
response.status = [200, 204][rand(1)]
response.body = {
'tenants_links' => [],
'tenants' => [
{'id' => '1',
'description' => 'Has access to everything',
'enabled' => true,
'name' => 'admin'},
{'id' => '2',
'description' => 'Normal tenant',
'enabled' => true,
'name' => 'default'},
{'id' => '3',
'description' => 'Disabled tenant',
'enabled' => false,
'name' => 'disabled'}
]
}
response
end
list_tenants_with_flavor_access(flavor_ref)
click to toggle source
def list_tenants_with_flavor_access(flavor_ref)
response = Excon::Response.new
response.status = 200
response.body = {
"flavor_access" => [{ "tenant_id" => @tenant_id.to_s, "flavor_id" => flavor_ref.to_s }]
}
response
end
list_usages(date_start = nil, date_end = nil, detailed=false)
click to toggle source
def list_usages(date_start = nil, date_end = nil, detailed=false)
params = Hash.new
response = Excon::Response.new
response.status = 200
response.body = {"tenant_usages"=>[{
"total_memory_mb_usage" => 0.00036124444444444445,
"total_vcpus_usage" => 7.055555555555556e-07,
"start" => "2012-03-06 05:05:56.349001",
"tenant_id" => "b97c8abba0c44a0987c63b858a4823e5",
"stop" => "2012-03-06 05:05:56.349255",
"total_hours" => 7.055555555555556e-07,
"total_local_gb_usage" => 0.0
}
]
}
response
end
list_volumes(detailed=true)
click to toggle source
def list_volumes(detailed=true)
Excon::Response.new(
:body => { 'volumes' => self.data[:volumes].values },
:status => 200
)
end
live_migrate_server(server_id, host, block_migration, disk_over_commit)
click to toggle source
def live_migrate_server(server_id, host, block_migration, disk_over_commit)
response = Excon::Response.new
response.status = 202
response
end
migrate_server(server_id)
click to toggle source
def migrate_server(server_id)
response = Excon::Response.new
response.status = 202
response
end
pause_server(server_id)
click to toggle source
def pause_server(server_id)
true
end
reboot_server(server_id, type = 'SOFT')
click to toggle source
def reboot_server(server_id, type = 'SOFT')
response = Excon::Response.new
response.status = 202
response
end
rebuild_server(server_id, image_ref, name, admin_pass=nil, metadata=nil, personality=nil)
click to toggle source
def rebuild_server(server_id, image_ref, name, admin_pass=nil, metadata=nil, personality=nil)
response = get_server_details(server_id)
response.body['server']['status'] = "REBUILD"
response
end
release_address(address_id)
click to toggle source
def release_address(address_id)
response = Excon::Response.new
response.status = 202
response.headers = {
"Content-Type" => "text/html; charset=UTF-8",
"Content-Length" => "0",
"Date" => Date.new
}
response.body = {}
response
end
remove_fixed_ip(server_id, address)
click to toggle source
def remove_fixed_ip(server_id, address)
true
end
remove_flavor_access(flavor_ref, tenant_id)
click to toggle source
def remove_flavor_access(flavor_ref, tenant_id)
response = Excon::Response.new
response.status = 200
response.body = {
"flavor_access" => []
}
response
end
rescue_server(server_id)
click to toggle source
def rescue_server(server_id)
true
end
reset_data()
click to toggle source
def reset_data
self.class.data.delete("#{@openstack_username}-#{@current_tenant}")
end
reset_server_state(server_id, status)
click to toggle source
def reset_server_state(server_id, status)
response = get_server_details(server_id)
response.body['server']['status'] = status.upcase
response
end
resize_server(server_id, flavor_ref)
click to toggle source
def resize_server(server_id, flavor_ref)
response = Excon::Response.new
response.status = 202
response
end
resume_server(server_id)
click to toggle source
def resume_server(server_id)
true
end
revert_resize_server(server_id)
click to toggle source
def revert_resize_server(server_id)
response = Excon::Response.new
response.status = 202
self.data[:servers][server_id]['flavorId'] = self.data[:servers][server_id]['old_flavorId']
self.data[:servers][server_id].delete('old_flavorId')
self.data[:last_modified][:servers][server_id] = Time.now
self.data[:servers][server_id]['status'] = 'ACTIVE'
response
end
server_actions(server_id)
click to toggle source
def server_actions(server_id)
Array.new
end
server_diagnostics(server_id)
click to toggle source
def server_diagnostics(server_id)
end
set_tenant(tenant)
click to toggle source
def set_tenant(tenant)
true
end
suspend_server(server_id)
click to toggle source
def suspend_server(server_id)
true
end
unpause_server(server_id)
click to toggle source
def unpause_server(server_id)
true
end
update_quota(tenant_id, options = {})
click to toggle source
def update_quota(tenant_id, options = {})
self.data[:quota_updated] = self.data[:quota].merge options
response = Excon::Response.new
response.status = 200
response.body = { 'quota_set' => self.data[:quota_updated] }
response
end
update_server(server_id, options = {})
click to toggle source
def update_server(server_id, options = {})
response = Excon::Response.new
if server = list_servers_detail.body['servers'].detect {|_| _['id'] == server_id}
if options['name']
server['name'] = options['name']
end
response.status = 200
response
else
raise Fog::Compute::OpenStack::NotFound
end
end