lib/fog/rackspace/requests/compute_v2/create_server.rb in fog-maestrodev-1.8.0.20130114204828 vs lib/fog/rackspace/requests/compute_v2/create_server.rb in fog-maestrodev-1.14.0.20130806165225
- old
+ new
@@ -1,30 +1,182 @@
module Fog
module Compute
class RackspaceV2
class Real
+ # Create server
+ # @param [String] name name of server
+ # @param [String] image_id of the image used to create server
+ # @param [String] flavor_id id of the flavor of the image
+ # @param [String] min_count
+ # @param [String] max_count
+ # @param [Hash] options
+ # @option options [Hash] metadata key value pairs of server metadata
+ # @option options [String] OS-DCF:diskConfig The disk configuration value. (AUTO or MANUAL)
+ # @option options [Hash] personality Hash containing data to inject into the file system of the cloud server instance during server creation.
+ # @option options [String] keypair Name of the kay-pair to associate with this server.
+ # @return [Excon::Response] response:
+ # * body [Hash]:
+ # * server [Hash]:
+ # * name [String] - name of server
+ # * imageRef [String] - id of image used to create server
+ # * flavorRef [String] - id of flavor used to create server
+ # * OS-DCF:diskConfig [String] - The disk configuration value.
+ # * name [String] - name of server
+ # * metadata [Hash] - Metadata key and value pairs.
+ # * personality [Array]:
+ # * [Hash]:
+ # * path - path of the file created
+ # * contents - Base 64 encoded file contents
+ # * networks [Array]:
+ # * [Hash]:
+ # * uuid [String] - uuid of attached network
+ # @raise [Fog::Compute::RackspaceV2::NotFound] - HTTP 404
+ # @raise [Fog::Compute::RackspaceV2::BadRequest] - HTTP 400
+ # @raise [Fog::Compute::RackspaceV2::InternalServerError] - HTTP 500
+ # @raise [Fog::Compute::RackspaceV2::ServiceError]
+ # @see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/CreateServers.html
+ # @see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/Server_Metadata-d1e2529.html
+ # @see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/Server_Personality-d1e2543.html
+ # @see http://docs.rackspace.com/servers/api/v2/cs-devguide/content/ch_extensions.html#diskconfig_attribute
+ #
+ # * State Transitions
+ # * BUILD -> ACTIVE
+ # * BUILD -> ERROR (on error)
def create_server(name, image_id, flavor_id, min_count, max_count, options = {})
data = {
'server' => {
- 'name' => name,
- 'imageRef' => image_id,
+ 'name' => name,
+ 'imageRef' => image_id,
'flavorRef' => flavor_id,
- 'minCount' => min_count,
- 'maxCount' => max_count
+ 'minCount' => min_count,
+ 'maxCount' => max_count
}
}
- data['server']['metadata'] = options[:metadata] unless options[:metadata].nil?
data['server']['OS-DCF:diskConfig'] = options[:disk_config] unless options[:disk_config].nil?
data['server']['metadata'] = options[:metadata] unless options[:metadata].nil?
data['server']['personality'] = options[:personality] unless options[:personality].nil?
+ data['server']['networks'] = options[:networks] || [
+ { :uuid => '00000000-0000-0000-0000-000000000000' },
+ { :uuid => '11111111-1111-1111-1111-111111111111' }
+ ]
+ data['server']['key_name'] = options[:keypair] unless options[:keypair].nil?
request(
- :body => Fog::JSON.encode(data),
+ :body => Fog::JSON.encode(data),
:expects => [202],
- :method => 'POST',
- :path => "servers"
+ :method => 'POST',
+ :path => "servers"
)
+ end
+ end
+
+ class Mock
+ def create_server(name, image_id, flavor_id, min_count, max_count, options={})
+ server_id = Fog::Rackspace::MockData.uuid
+ public_ip4 = Fog::Rackspace::MockData.ipv4_address
+ public_ip6 = Fog::Rackspace::MockData.ipv6_address
+ private_ip4 = Fog::Rackspace::MockData.ipv4_address
+ private_ip6 = Fog::Rackspace::MockData.ipv6_address
+ admin_pass = Fog::Mock.random_letters(12)
+
+ flavor = self.data[:flavors][flavor_id]
+ image = self.data[:images][image_id]
+
+ server = {
+ "OS-DCF:diskConfig" => "AUTO",
+ "OS-EXT-STS:power_state" => 1,
+ "OS-EXT-STS:task_state" => nil,
+ "OS-EXT-STS:vm_state" => "active",
+ "accessIPv4" => public_ip4,
+ "accessIPv6" => public_ip6,
+ "addresses" => {
+ "private" => [
+ {
+ "addr" => private_ip4,
+ "version" => 4
+ }
+ ],
+ "public" => [
+ {
+ "addr" => public_ip4,
+ "version" => 4
+ },
+ {
+ "addr" => public_ip6,
+ "version" => 6
+ }
+ ]
+ },
+ "created" => "2012-07-28T15:32:25Z",
+ "flavor" => Fog::Rackspace::MockData.keep(flavor, "id", "links"),
+ "hostId" => Fog::Mock.random_hex(56),
+ "id" => server_id,
+ "image" => Fog::Rackspace::MockData.keep(image, "id", "links"),
+ "links" => [
+ {
+ "href" => "https://dfw.servers.api.rackspacecloud.com/v2/010101/servers/#{server_id}",
+ "rel" => "self",
+ },
+ {
+ "href" => "https://dfw.servers.api.rackspacecloud.com/010101/servers/#{server_id}",
+ "rel" => "bookmark",
+ }
+ ],
+ "metadata" => {},
+ "name" => name,
+ "progress" => 100,
+ "rax-bandwidth:bandwidth" => [
+ {
+ "audit_period_end" => "2012-08-16T14:12:00Z",
+ "audit_period_start" => "2012-08-16T06:00:00Z",
+ "bandwidth_inbound" => 39147845,
+ "bandwidth_outbound" => 13390651,
+ "interface" => "public",
+ },
+ {
+ "audit_period_end" => "2012-08-16T14:12:00Z",
+ "audit_period_start" => "2012-08-16T06:00:00Z",
+ "bandwidth_inbound" => 24229191,
+ "bandwidth_outbound" => 84,
+ "interface" => "private",
+ }
+ ],
+ "status" => "ACTIVE",
+ "tenant_id" => "010101",
+ "updated" => "2012-07-28T15:37:09Z",
+ "user_id" => "170454",
+ :volume_ids => [],
+ }
+
+ # add in additional networks
+ if options[:networks]
+ options[:networks].each do |network|
+ net_label = self.data[:networks][network[:uuid]]["label"]
+ server["addresses"] = { net_label => []}
+ end
+ end
+ self.data[:servers][server_id] = server
+
+ response = {
+ "server" => {
+ "OS-DCF:diskConfig" => "AUTO",
+ "adminPass" => admin_pass,
+ "id" => server_id,
+ "links" => [
+ {
+ "href" => "https://dfw.servers.api.rackspacecloud.com/v2/010101/servers/#{server_id}",
+ "rel" => "self"
+ },
+ {
+ "href" => "https://dfw.servers.api.rackspacecloud.com/010101/servers/#{server_id}",
+ "rel" => "bookmark"
+ }
+ ]
+ }
+ }
+
+ response(:body => response)
end
end
end
end
end