/
server.rb
155 lines (124 loc) · 4.05 KB
/
server.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
require 'fog/model'
module Fog
module AWS
module EC2
class Server < Fog::Model
identity :id, 'instanceId'
attr_accessor :architecture
attribute :ami_launch_index, 'amiLaunchIndex'
attribute :availability_zone, 'availabilityZone'
attribute :block_device_mapping, 'blockDeviceMapping'
attribute :dns_name, 'dnsName'
attribute :groups
attribute :flavor_id, 'instanceType'
attribute :image_id, 'imageId'
attribute :ip_address, 'ipAddress'
attribute :kernel_id, 'kernelId'
attribute :key_name, 'keyName'
attribute :created_at, 'launchTime'
attribute :monitoring
attribute :product_codes, 'productCodes'
attribute :private_dns_name, 'privateDnsName'
attribute :private_ip_address, 'privateIpAddress'
attribute :ramdisk_id, 'ramdiskId'
attribute :reason
attribute :root_device_name, 'rootDeviceName'
attribute :root_device_type, 'rootDeviceType'
attribute :state, 'instanceState'
attribute :user_data
def initialize(attributes={})
@groups ||= ["default"]
@flavor_id ||= 'm1.small'
super
end
def addresses
requires :id
connection.addresses(:server => self)
end
def console_output
requires :id
connection.get_console_output(@id)
end
def destroy
requires :id
connection.terminate_instances(@id)
true
end
# def security_group
# connection.security_groups.all(@group_id)
# end
#
# def security_group=(new_security_group)
# @group_id = new_security_group.name
# end
def flavor_id
@flavor && @flavor.id || @flavor_id
end
def flavor=(new_flavor)
@flavor = new_flavor
end
def flavor
@flavor ||= connection.flavors.all.detect {|flavor| flavor.id == @flavor_id}
end
def key_pair
requires :key_name
connection.keypairs.all(@key_name).first
end
def key_pair=(new_keypair)
@key_name = new_keypair.name
end
def monitoring=(new_monitoring)
if new_monitoring.is_a?(Hash)
@monitoring = new_monitoring['state']
else
@monitoring = new_monitoring
end
end
def placement=(new_placement)
if new_placement.is_a?(Hash)
@availability_zone = new_placement['availabilityZone']
else
@availability_zone = new_placement
end
end
def ready?
@state == 'running'
end
def reboot
requires :id
connection.reboot_instances(@id)
true
end
def save
requires :image_id
options = {
'BlockDeviceMapping' => @block_device_mapping,
'InstanceType' => flavor_id,
'KernelId' => @kernel_id,
'KeyName' => @key_name,
'Monitoring.Enabled' => @monitoring,
'Placement.AvailabilityZone' => @availability_zone,
'RamdiskId' => @ramdisk_id,
'SecurityGroup' => @groups,
'UserData' => @user_data
}
data = connection.run_instances(@image_id, 1, 1, options)
merge_attributes(data.body['instancesSet'].first)
true
end
def volumes
requires :id
connection.volumes(:server => self)
end
private
def state=(new_state)
if new_state.is_a?(Hash)
@state = new_state['name']
else
@state = new_state
end
end
end
end
end
end