Class: Inception::InceptionServer
- Inherits:
-
Object
- Object
- Inception::InceptionServer
- Defined in:
- lib/inception/inception_server.rb
Constant Summary collapse
- DEFAULT_SERVER_NAME =
"inception"
- DEFAULT_FLAVOR =
"m1.small"
- DEFAULT_DISK_SIZE =
16
- DEFAULT_SECURITY_GROUPS =
["ssh"]
Instance Attribute Summary collapse
-
#attributes ⇒ Object
readonly
Returns the value of attribute attributes.
Instance Method Summary collapse
-
#create ⇒ Object
Create the underlying server, with key pair & security groups, unless it is already created.
- #default_disk_device ⇒ Object
-
#delete_all ⇒ Object
Delete the server, volume and release the IP address.
- #delete_key_pair ⇒ Object
- #delete_server ⇒ Object
- #delete_volume ⇒ Object
- #disk_devices ⇒ Object
-
#disk_size ⇒ Object
Size of attached persistent disk for the inception server.
-
#export_attributes ⇒ Object
Because @attributes is not the same as @attributes.provisioned we need a helper to export the complete nested attributes.
- #external_disk_device ⇒ Object
-
#flavor ⇒ Object
Flavor/instance type of the server to be provisioned TODO: DEFAULT_FLAVOR should become IaaS/provider specific.
- #fog_compute ⇒ Object
- #fog_server ⇒ Object
- #image_id ⇒ Object
-
#initialize(provider_client, attributes, ssh_dir) ⇒ InceptionServer
constructor
Required @attributes: { “name” => “inception”, “ip_address” => “54.214.15.178”, “key_pair” => { “name” => “inception”, “private_key” => “private_key”, “public_key” => “public_key” } }.
- #ip_address ⇒ Object
- #key_name ⇒ Object
- #private_key_path ⇒ Object
-
#provisioned ⇒ Object
The progresive/final attributes of the provisioned Inception server & persistent disk.
- #release_ip_address ⇒ Object
- #security_groups ⇒ Object
- #server_name ⇒ Object
- #user_host ⇒ Object
Constructor Details
#initialize(provider_client, attributes, ssh_dir) ⇒ InceptionServer
Required @attributes:
{
"name" => "inception",
"ip_address" => "54.214.15.178",
"key_pair" => {
"name" => "inception",
"private_key" => "private_key",
"public_key" => "public_key"
}
}
Including optional @attributes and default values:
{
"name" => "inception",
"ip_address" => "54.214.15.178",
"security_groups" => ["ssh"],
"flavor" => "m1.small",
"key_pair" => {
"name" => "inception",
"private_key" => "private_key",
"public_key" => "public_key"
}
}
39 40 41 42 43 44 |
# File 'lib/inception/inception_server.rb', line 39 def initialize(provider_client, attributes, ssh_dir) @provider_client = provider_client @ssh_dir = ssh_dir @attributes = attributes.is_a?(Hash) ? Settingslogic.new(attributes) : attributes raise "@attributes must be Settingslogic (or Hash)" unless @attributes.is_a?(Settingslogic) end |
Instance Attribute Details
#attributes ⇒ Object (readonly)
Returns the value of attribute attributes.
11 12 13 |
# File 'lib/inception/inception_server.rb', line 11 def attributes @attributes end |
Instance Method Details
#create ⇒ Object
Create the underlying server, with key pair & security groups, unless it is already created
The @attributes hash is updated with a ‘provisioned` key during/after creation. When saved as YAML it might look like:
inception:
provisioned:
image_id: ami-123456
server_id: i-e7f005d2
security_groups:
- ssh
- mosh
username: ubuntu
disk_device: /dev/sdi
host: ec2-54-214-15-178.us-west-2.compute.amazonaws.com
validated: true
converged: true
62 63 64 65 66 67 68 |
# File 'lib/inception/inception_server.rb', line 62 def create validate_attributes_for_bootstrap ensure_required_security_groups create_missing_default_security_groups bootstrap_vm attach_persistent_disk end |
#default_disk_device ⇒ Object
188 189 190 191 192 193 194 195 196 197 |
# File 'lib/inception/inception_server.rb', line 188 def default_disk_device case @provider_client when Bosh::Providers::Clients::AwsProviderClient { "external" => "/dev/sdf", "internal" => "/dev/xvdf" } when Bosh::Providers::Clients::OpenStackProviderClient { "external" => "/dev/vdc", "internal" => "/dev/vdc" } else raise "Please implement InceptionServer#default_disk_device for #{@provider_client.class}" end end |
#delete_all ⇒ Object
Delete the server, volume and release the IP address
71 72 73 74 75 76 |
# File 'lib/inception/inception_server.rb', line 71 def delete_all delete_server delete_volume delete_key_pair release_ip_address end |
#delete_key_pair ⇒ Object
106 107 108 109 110 111 112 113 114 115 |
# File 'lib/inception/inception_server.rb', line 106 def delete_key_pair key_pair_name = attributes.exists?("key_pair.name") if key_pair_name && key_pair = fog_compute.key_pairs.get(key_pair_name) puts "Deleting key pair '#{key_pair_name}'" key_pair.destroy else puts "Keypair already destroyed" end attributes.delete("key_pair") end |
#delete_server ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/inception/inception_server.rb', line 78 def delete_server @fog_server = nil # force reload of fog_server model if fog_server print "Deleting server..." fog_server.destroy wait_for_termination(fog_server) unless Fog.mocking? puts "done." else puts "Server already destroyed" end provisioned.delete("host") provisioned.delete("server_id") provisioned.delete("username") end |
#delete_volume ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/inception/inception_server.rb', line 93 def delete_volume volume_id = provisioned.exists?("disk_device.volume_id") if volume_id && (volume = fog_compute.volumes.get(volume_id)) && volume.ready? print "Deleting volume..." volume.destroy wait_for_termination(volume, "deleting") puts "" else puts "Volume already destroyed" end provisioned.delete("disk_device") end |
#disk_devices ⇒ Object
180 181 182 |
# File 'lib/inception/inception_server.rb', line 180 def disk_devices provisioned["disk_device"] ||= default_disk_device end |
#disk_size ⇒ Object
Size of attached persistent disk for the inception server
153 154 155 |
# File 'lib/inception/inception_server.rb', line 153 def disk_size @attributes["disk_size"] ||= DEFAULT_DISK_SIZE end |
#export_attributes ⇒ Object
Because @attributes is not the same as @attributes.provisioned we need a helper to export the complete nested attributes.
174 175 176 177 178 |
# File 'lib/inception/inception_server.rb', line 174 def export_attributes attrs = attributes.to_nested_hash attrs["provisioned"] = provisioned.to_nested_hash attrs end |
#external_disk_device ⇒ Object
184 185 186 |
# File 'lib/inception/inception_server.rb', line 184 def external_disk_device disk_devices["external"] end |
#flavor ⇒ Object
Flavor/instance type of the server to be provisioned TODO: DEFAULT_FLAVOR should become IaaS/provider specific
148 149 150 |
# File 'lib/inception/inception_server.rb', line 148 def flavor @attributes["flavor"] ||= DEFAULT_FLAVOR end |
#fog_compute ⇒ Object
211 212 213 |
# File 'lib/inception/inception_server.rb', line 211 def fog_compute @provider_client.fog_compute end |
#fog_server ⇒ Object
203 204 205 206 207 208 209 |
# File 'lib/inception/inception_server.rb', line 203 def fog_server @fog_server ||= begin if server_id = provisioned["server_id"] fog_compute.servers.get(server_id) end end end |
#image_id ⇒ Object
161 162 163 |
# File 'lib/inception/inception_server.rb', line 161 def image_id @attributes["image_id"] ||= @provider_client.raring_image_id end |
#ip_address ⇒ Object
157 158 159 |
# File 'lib/inception/inception_server.rb', line 157 def ip_address provisioned.ip_address end |
#key_name ⇒ Object
138 139 140 |
# File 'lib/inception/inception_server.rb', line 138 def key_name @attributes.key_pair.name end |
#private_key_path ⇒ Object
142 143 144 |
# File 'lib/inception/inception_server.rb', line 142 def private_key_path @private_key_path ||= File.join(@ssh_dir, key_name) end |
#provisioned ⇒ Object
The progresive/final attributes of the provisioned Inception server & persistent disk.
167 168 169 170 |
# File 'lib/inception/inception_server.rb', line 167 def provisioned @attributes["provisioned"] = {} unless @attributes["provisioned"] @attributes.provisioned end |
#release_ip_address ⇒ Object
118 119 120 121 122 123 124 125 126 127 |
# File 'lib/inception/inception_server.rb', line 118 def release_ip_address public_ip = provisioned.exists?("ip_address") if public_ip && ip_address = fog_compute.addresses.get(public_ip) puts "Releasing IP address #{public_ip}" ip_address.destroy else puts "IP address already released" end provisioned.delete("ip_address") end |
#security_groups ⇒ Object
129 130 131 |
# File 'lib/inception/inception_server.rb', line 129 def security_groups @attributes.security_groups end |
#server_name ⇒ Object
133 134 135 136 |
# File 'lib/inception/inception_server.rb', line 133 def server_name @attributes["name"] ||= DEFAULT_SERVER_NAME @attributes.name end |
#user_host ⇒ Object
199 200 201 |
# File 'lib/inception/inception_server.rb', line 199 def user_host "#{provisioned.username}@#{provisioned.host}" end |