openstudio-aws 0.3.2 → 0.4.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,5 @@
1
- # NOTE: Do not modify this file as it is copied over. Modify the source file and rerun rake import_files
2
1
  ######################################################################
3
- # Copyright (c) 2008-2014, Alliance for Sustainable Energy.
2
+ # Copyright (c) 2008-2015, Alliance for Sustainable Energy.
4
3
  # All rights reserved.
5
4
  #
6
5
  # This library is free software; you can redistribute it and/or
@@ -54,7 +53,8 @@ class OpenStudioAwsWrapper
54
53
  VALID_OPTIONS = [:proxy, :credentials]
55
54
 
56
55
  def initialize(options = {}, group_uuid = nil)
57
- @group_uuid = group_uuid || (SecureRandom.uuid).delete('-')
56
+ @group_uuid = group_uuid || (SecureRandom.uuid).gsub('-', '')
57
+ logger.info "GroupUUID is #{@group_uuid}"
58
58
 
59
59
  @security_groups = []
60
60
  @key_pair_name = nil
@@ -118,15 +118,44 @@ class OpenStudioAwsWrapper
118
118
  describe_availability_zones.to_json
119
119
  end
120
120
 
121
- def describe_total_instances
121
+ def total_instances_count
122
122
  resp = @aws.describe_instance_status
123
123
 
124
+ # TODO: make this return the region not the availability zone
124
125
  region = resp.instance_statuses.length > 0 ? resp.instance_statuses.first.availability_zone : 'no_instances'
125
126
  { total_instances: resp.instance_statuses.length, region: region }
126
127
  end
127
128
 
128
- def describe_total_instances_json
129
- describe_total_instances.to_json
129
+ # describe the instances by group id (this is the default method)
130
+ def describe_instances
131
+ resp = nil
132
+ if group_uuid
133
+ resp = @aws.describe_instances(
134
+ filters: [
135
+ # {name: 'instance-state-code', values: [0.to_s, 16.to_s]}, # running or pending -- any state
136
+ { name: 'tag-key', values: ['GroupUUID'] },
137
+ { name: 'tag-value', values: [group_uuid.to_s] }
138
+ ]
139
+ )
140
+ else
141
+ resp = @aws.describe_instances
142
+ end
143
+
144
+ # Any additional filters
145
+ instance_data = nil
146
+ if resp
147
+ instance_data = []
148
+ resp.reservations.each do |r|
149
+ r.instances.each do |i|
150
+ i_h = i.to_hash
151
+ if i_h[:tags].any? { |h| (h[:key] == 'GroupUUID') && (h[:value] == group_uuid.to_s) }
152
+ instance_data << i_h
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ instance_data
130
159
  end
131
160
 
132
161
  # return all of the running instances, or filter by the group_uuid & instance type
@@ -220,13 +249,14 @@ class OpenStudioAwsWrapper
220
249
  end
221
250
 
222
251
  def terminate_instances(ids)
252
+ resp = nil
223
253
  begin
224
254
  resp = @aws.terminate_instances(
225
255
  instance_ids: ids
226
256
  )
227
257
  rescue Aws::EC2::Errors::InvalidInstanceIDNotFound
228
258
  # Log that the instances couldn't be found?
229
- return resp = { error: 'instances could not be found' }
259
+ resp = { error: 'instances could not be found' }
230
260
  end
231
261
 
232
262
  resp
@@ -263,12 +293,26 @@ class OpenStudioAwsWrapper
263
293
  logger.info("create key pair: #{@key_pair_name}")
264
294
  end
265
295
 
296
+ # Delete the key pair from aws
297
+ def delete_key_pair(key_pair_name = nil)
298
+ tmp_name = key_pair_name || "os-key-pair-#{@group_uuid}"
299
+ resp = nil
300
+ begin
301
+ logger.info "Trying to delete key pair #{tmp_name}"
302
+ resp = @aws.delete_key_pair(key_name: tmp_name)
303
+ rescue
304
+ logger.info "could not delete the key pair '#{tmp_name}'"
305
+ end
306
+
307
+ resp
308
+ end
309
+
266
310
  def load_private_key(filename)
267
311
  unless File.exist? filename
268
312
  # check if the file basename exists in your user directory
269
313
  filename = File.expand_path("~/.ssh/#{File.basename(filename)}")
270
314
  if File.exist? filename
271
- puts "Found key of same name in user's home ssh folder #{filename}"
315
+ logger.info "Found key of same name in user's home ssh folder #{filename}"
272
316
  # using the key in your home directory
273
317
  else
274
318
  fail "Could not find private key #{filename}" unless File.exist? filename
@@ -279,11 +323,13 @@ class OpenStudioAwsWrapper
279
323
  @private_key = File.read(filename)
280
324
  end
281
325
 
282
- def save_private_key(filename)
326
+ def save_private_key(directory = '.', filename = 'ec2_server_key.pem')
283
327
  if @private_key
284
- @private_key_file_name = File.expand_path filename
285
- File.open(filename, 'w') { |f| f << @private_key }
286
- File.chmod(0600, filename)
328
+ @private_key_file_name = File.expand_path "#{directory}/#{filename}"
329
+ logger.info "Saving server private key in #{@private_key_file_name}"
330
+ File.open(@private_key_file_name, 'w') { |f| f << @private_key }
331
+ logger.info 'Setting permissions of server private key to 0600'
332
+
287
333
  else
288
334
  fail "No private key found in which to persist with filename #{filename}"
289
335
  end
@@ -291,8 +337,15 @@ class OpenStudioAwsWrapper
291
337
 
292
338
  # save off the worker public/private keys that were created
293
339
  def save_worker_keys(directory = '.')
294
- File.open("#{directory}/ec2_worker_key.pem", 'w') { |f| f << @worker_keys.private_key }
295
- File.open("#{directory}/ec2_worker_key.pub", 'w') { |f| f << @worker_keys.public_key }
340
+ wk = "#{directory}/ec2_worker_key.pem"
341
+ logger.info "Saving worker private key in #{wk}"
342
+ File.open(wk, 'w') { |f| f << @worker_keys.private_key }
343
+ logger.info 'Setting permissions of worker private key to 0600'
344
+ File.chmod(0600, wk)
345
+
346
+ wk = "#{directory}/ec2_worker_key.pub"
347
+ logger.info "Saving worker public key in #{wk}"
348
+ File.open(wk, 'w') { |f| f << @worker_keys.public_key }
296
349
  end
297
350
 
298
351
  def launch_server(image_id, instance_type, launch_options = {})
@@ -397,8 +450,8 @@ class OpenStudioAwsWrapper
397
450
  @group_uuid = server_data_hash[:group_id] || @group_uuid
398
451
  load_private_key(server_data_hash[:server][:private_key_file_name])
399
452
 
400
- logger.info "finding the server for groupid of #{group_uuid}"
401
- fail 'no group uuid defined either in member variable or method argument' if group_uuid.nil?
453
+ logger.info "Finding the server for GroupUUID of #{group_uuid}"
454
+ fail 'no GroupUUID defined either in member variable or method argument' if group_uuid.nil?
402
455
 
403
456
  # This should really just be a single call to describe running instances
404
457
  @server = nil
@@ -417,7 +470,7 @@ class OpenStudioAwsWrapper
417
470
  logger.info "Server instance is already defined with instance #{resp[:instance_id]}"
418
471
  end
419
472
  else
420
- puts 'could not find a running server instance'
473
+ logger.info 'could not find a running server instance'
421
474
  end
422
475
 
423
476
  # find the workers
@@ -538,7 +591,7 @@ class OpenStudioAwsWrapper
538
591
  sv = ami[:tags_hash][:openstudio_server_version]
539
592
 
540
593
  if sv.nil? || sv == ''
541
- puts 'found nil version, incrementing from 0.0.1'
594
+ logger.info 'found nil version, incrementing from 0.0.1'
542
595
  sv = get_next_version('0.0.1', list_of_svs)
543
596
  end
544
597
  list_of_svs << sv
@@ -590,10 +643,8 @@ class OpenStudioAwsWrapper
590
643
  end
591
644
  end
592
645
  end
593
- # puts "Current AMIs: #{JSON.pretty_generate(amis)}"
594
646
 
595
647
  # merge in the existing AMIs the existing amis into the 'unknown category, but don't flag them as 'deprecate'
596
- # puts "Existing AMIs: #{JSON.pretty_generate(existing)}"
597
648
  existing.keys.each do |ami_key|
598
649
  next if ami_key == 'default'.to_sym # ignore default
599
650
 
@@ -612,7 +663,6 @@ class OpenStudioAwsWrapper
612
663
  a[:openstudio_server_version] = next_version.to_s
613
664
  end
614
665
 
615
- # puts "After merge: #{JSON.pretty_generate(amis)}"
616
666
  # flip these around for openstudio server section
617
667
  amis[:openstudio_server].keys.each do |key|
618
668
  next if key.to_s.to_version.satisfies('0.0.*')
@@ -639,8 +689,6 @@ class OpenStudioAwsWrapper
639
689
  end
640
690
  amis[:openstudio] = Hash[amis[:openstudio].sort_by { |k, _| k.to_s.to_version }.reverse]
641
691
 
642
- # puts "After sort: #{JSON.pretty_generate(amis)}"
643
-
644
692
  amis
645
693
  end
646
694
  end
@@ -0,0 +1,55 @@
1
+ ######################################################################
2
+ # Copyright (c) 2008-2015, Alliance for Sustainable Energy.
3
+ # All rights reserved.
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ ######################################################################
19
+
20
+ require_relative 'openstudio_aws_logger'
21
+
22
+ class OpenStudioCloudWatch
23
+ include Logging
24
+
25
+ attr_accessor :private_key_file_name
26
+ attr_accessor :security_groups
27
+
28
+ VALID_OPTIONS = [:proxy, :credentials]
29
+
30
+ def initialize(options = {})
31
+ # store an instance variable with the proxy for passing to instances for use in scp/ssh
32
+ @proxy = options[:proxy] ? options[:proxy] : nil
33
+
34
+ # need to remove the prxoy information here
35
+ @aws = Aws::CloudWatch::Client.new(options[:credentials])
36
+ end
37
+
38
+ def estimated_charges
39
+ end_time = Time.now.utc
40
+ start_time = end_time - 86400
41
+ resp = @aws.get_metric_statistics(
42
+ dimensions: [
43
+ { name: 'ServiceName', value: 'AmazonEC2' },
44
+ { name: 'Currency', value: 'USD' }],
45
+ metric_name: 'EstimatedCharges',
46
+ namespace: 'AWS/Billing',
47
+ start_time: start_time.iso8601,
48
+ end_time: end_time.iso8601,
49
+ period: 300,
50
+ statistics: ['Maximum']
51
+ )
52
+
53
+ resp.data || []
54
+ end
55
+ end
@@ -44,28 +44,12 @@ chmod 775 /usr/local/bin/ec2-metadata
44
44
  mkdir -p /etc/openstudio-server
45
45
  ec2-metadata -a -i -t -h -o -z -p -v > /etc/openstudio-server/instance.yml
46
46
 
47
- # make sure supervisor is running
48
- sudo service supervisor start
49
-
50
47
  # stop the various services that use mongo
51
48
  service delayed_job stop
52
- supervisorctl stop delayed_job
53
49
  service apache2 stop
54
50
  service mongodb stop
55
51
  service mongod stop
56
52
 
57
- # make sure the the /mnt directory exists if i2 instances.
58
- # For now this assumes that the volume is xvdb. In the future this
59
- # should be dynamic
60
- if ec2-metadata --instance-type | grep -q 'i2.'; then
61
- mkfs.ext4 /dev/xvdb
62
- mkdir -p /mnt
63
- mount -t ext4 /dev/xvdb /mnt
64
-
65
- echo "/dev/xvdb /mnt auto noatime 0 0" | sudo tee -a /etc/fstab
66
- mount -a
67
- fi
68
-
69
53
  # remove mongo db & add it back
70
54
  mkdir -p /mnt/mongodb/data
71
55
  chown mongodb:nogroup /mnt/mongodb/data
@@ -134,11 +118,9 @@ find /mnt/openstudio -type f -print0 | xargs -0 chmod 664
134
118
 
135
119
  # restart rserve
136
120
  service Rserve restart
137
- supervisorctl restart Rserve
138
121
 
139
- # start delayed jobs
122
+ # restart delayed jobs
140
123
  service delayed_job start
141
- supervisorctl start delayed_job
142
124
 
143
125
  #file flag the user_data has completed
144
126
  cat /dev/null > /home/ubuntu/user_data_done
@@ -35,18 +35,6 @@ chmod 775 /usr/local/bin/ec2-metadata
35
35
  mkdir -p /etc/openstudio-server
36
36
  ec2-metadata -a -i -t -h -o -z -p -v > /etc/openstudio-server/instance.yml
37
37
 
38
- # make sure the the /mnt directory exists if i2 instances.
39
- # For now this assumes that the volume is xvdb. In the future this
40
- # should be dynamic
41
- if ec2-metadata --instance-type | grep -q 'i2.'; then
42
- mkfs.ext4 /dev/xvdb
43
- mkdir -p /mnt
44
- mount -t ext4 /dev/xvdb /mnt
45
-
46
- echo "/dev/xvdb /mnt auto noatime 0 0" | sudo tee -a /etc/fstab
47
- mount -a
48
- fi
49
-
50
38
  ## Worker Data Configuration -- On Vagrant this is a separate file
51
39
 
52
40
  rm -f /tmp/snow.log
@@ -75,11 +63,14 @@ find /mnt/openstudio -type f -print0 | xargs -0 chmod 664
75
63
 
76
64
  ## End Worker Data Configuration
77
65
 
78
- # make sure supervisor is running
79
- sudo service supervisor start
80
-
81
- # Rserve is now on the worker nodes for use by measures
82
- supervisorctl restart Rserve
66
+ #turn off hyperthreading
67
+ # NL: do not turn off hyperthreading, rather, just limit the number of cores and see if it
68
+ # makes a difference.
69
+ #for cpunum in $(
70
+ # cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list |
71
+ # cut -s -d, -f2- | tr ',' '\n' | sort -un); do
72
+ # echo 0 > /sys/devices/system/cpu/cpu$cpunum/online
73
+ #done
83
74
 
84
75
  #file flag the user_data has completed
85
76
  cat /dev/null > /home/ubuntu/user_data_done
@@ -16,13 +16,16 @@ begin
16
16
  rescue LoadError
17
17
  puts 'Failed to load AWS-SDK-CORE gem'
18
18
  puts ' try running: gem install aws-sdk-core'
19
- exit
19
+
20
+ exit 1
20
21
  end
21
22
 
23
+ require 'openstudio/core_ext/hash'
22
24
  require 'openstudio/lib/openstudio_aws_logger'
23
25
  require 'openstudio/aws/aws'
24
26
  require 'openstudio/aws/config'
25
27
  require 'openstudio/aws/version'
26
28
  require 'openstudio/lib/openstudio_aws_instance'
27
29
  require 'openstudio/lib/openstudio_aws_wrapper'
30
+ require 'openstudio/lib/openstudio_cloud_watch'
28
31
  require 'openstudio/lib/ami_list'
@@ -19,8 +19,8 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.add_dependency 'net-scp', '~> 1.1'
21
21
  s.add_dependency 'aws-sdk-core', '~> 2.0'
22
- s.add_dependency 'semantic', '~> 1.3'
23
- s.add_dependency 'sshkey', '~> 1.6'
22
+ s.add_dependency 'semantic', '~> 1.4'
23
+ s.add_dependency 'sshkey', '~> 1.7'
24
24
 
25
25
  s.add_development_dependency 'bundler', '~> 1.7'
26
26
  s.add_development_dependency 'rake', '~> 10.4'
@@ -12,6 +12,7 @@ describe OpenStudio::Aws::Aws do
12
12
  @group_id = nil
13
13
 
14
14
  FileUtils.rm_f 'ec2_server_key.pem' if File.exist? 'ec2_server_key.pem'
15
+ FileUtils.rm_f 'server_data.json' if File.exist? 'server_data.json'
15
16
  end
16
17
 
17
18
  it 'should create a new instance' do
@@ -27,6 +28,8 @@ describe OpenStudio::Aws::Aws do
27
28
 
28
29
  @aws.create_server(options)
29
30
 
31
+ @aws.save_cluster_info 'server_data.json'
32
+
30
33
  expect(File.exist?('ec2_server_key.pem')).to be true
31
34
  expect(File.exist?('server_data.json')).to be true
32
35
  expect(File.exist?('ec2_worker_key.pem')).to be true
@@ -64,19 +67,38 @@ describe OpenStudio::Aws::Aws do
64
67
  expect(@aws.os_aws.server).not_to be_nil
65
68
  end
66
69
 
67
- it 'should kill running instances' do
68
- # how to test this?
70
+ after :all do
71
+ if File.exist? 'server_data.json'
72
+ j = JSON.parse(File.read('server_data.json'), symbolize_names: true)
73
+
74
+ @aws.terminate_instances_by_group_id(j[:group_id])
75
+ end
69
76
  end
70
77
  end
71
78
 
72
79
  context 'upload data to a server' do
73
- it 'should create a server' do
80
+ before :all do
81
+ @group_id = nil
82
+
74
83
  config = OpenStudio::Aws::Config.new
75
- aws = OpenStudio::Aws::Aws.new
84
+ @aws = OpenStudio::Aws::Aws.new
85
+ end
76
86
 
77
- options = { instance_type: 'm3.medium', image_id: SERVER_AMI }
87
+ it 'should create a server' do
88
+ options = {
89
+ instance_type: 'm3.medium',
90
+ image_id: SERVER_AMI
91
+ }
78
92
 
79
- aws.create_server(options)
93
+ @aws.create_server(options)
94
+ @aws.create_workers(0, options)
95
+
96
+ @aws.save_cluster_info 'server_data.json'
97
+
98
+ h = @aws.os_aws.server.to_os_hash
99
+ expect(h[:group_id]).to be_a String
100
+ expect(h[:group_id]).to match /^[\d\S]{32}$/
101
+ @group_id = h[:group_id]
80
102
  end
81
103
 
82
104
  it 'should upload a file after loading the existing server' do
@@ -90,7 +112,6 @@ describe OpenStudio::Aws::Aws do
90
112
  aws2.load_instance_info_from_file('server_data.json')
91
113
 
92
114
  expect(aws2.os_aws.server.group_uuid).to eq j[:group_id]
93
- puts aws2.os_aws.server.inspect
94
115
 
95
116
  local_file = File.expand_path('spec/resources/upload_me.sh')
96
117
  remote_file = '/home/ubuntu/i_uploaded_this_file.sh'
@@ -111,7 +132,11 @@ describe OpenStudio::Aws::Aws do
111
132
  end
112
133
 
113
134
  after :all do
114
- # FileUtils.rm_f 'ec2_server_key.pem' if File.exist? 'ec2_server_key.pem'
135
+ if File.exist? 'server_data.json'
136
+ j = JSON.parse(File.read('server_data.json'), symbolize_names: true)
137
+
138
+ @aws.terminate_instances_by_group_id(j[:group_id])
139
+ end
115
140
  end
116
141
  end
117
142
 
@@ -152,6 +177,8 @@ describe OpenStudio::Aws::Aws do
152
177
 
153
178
  @aws.create_server(options)
154
179
 
180
+ @aws.save_cluster_info 'server_data.json'
181
+
155
182
  expect(File.exist?('ec2_server_key.pem')).to be true
156
183
  expect(File.exist?('server_data.json')).to be true
157
184
  expect(@aws.os_aws.server).not_to be_nil
@@ -161,8 +188,6 @@ describe OpenStudio::Aws::Aws do
161
188
  expect(h[:group_id]).to match /^[\d\S]{32}$/
162
189
  expect(h[:location]).to eq 'AWS'
163
190
 
164
- puts h.inspect
165
-
166
191
  @group_id = h[:group_id]
167
192
  ensure
168
193
  @aws.terminate_instances_by_group_id(h[:group_id])
@@ -178,52 +203,10 @@ describe OpenStudio::Aws::Aws do
178
203
  @group_id = nil
179
204
  end
180
205
 
181
- it 'should create allow a zero length worker' do
182
- begin
183
- begin
184
- options = {
185
- instance_type: 'm3.medium',
186
- image_id: SERVER_AMI,
187
- tags: [
188
- 'ci_tests=true',
189
- 'ServerOnly=true'
190
- ]
191
- }
192
-
193
- expect { @aws.create_workers(0) }.to raise_error "Can't create workers without a server instance running"
194
-
195
- test_pem_file = 'ec2_server_key.pem'
196
- FileUtils.rm_f test_pem_file if File.exist? test_pem_file
197
- FileUtils.rm_f 'server_data.json' if File.exist? 'server_data.json'
198
-
199
- @aws.create_server(options)
200
-
201
- # Still have to call "create workers" or the configuration won't happen.
202
- @aws.create_workers(0, options)
203
-
204
- h = @aws.os_aws.server.to_os_hash
205
- expect(h[:group_id]).to be_a String
206
- expect(h[:group_id]).to match /^[\d\S]{32}$/
207
- expect(h[:location]).to eq 'AWS'
208
- ensure
209
- @aws.terminate_instances_by_group_id(h[:group_id])
210
- end
211
- end
212
- end
213
- end
214
-
215
- context 'i2-instances' do
216
- before :all do
217
- @config = OpenStudio::Aws::Config.new
218
- @aws = OpenStudio::Aws::Aws.new
219
-
220
- @group_id = nil
221
- end
222
-
223
- it 'should create an i2 instance and mount the storage' do
206
+ it 'should allow a zero length worker' do
224
207
  begin
225
208
  options = {
226
- instance_type: 'i2.xlarge',
209
+ instance_type: 'm3.medium',
227
210
  image_id: SERVER_AMI,
228
211
  tags: [
229
212
  'ci_tests=true',
@@ -243,13 +226,58 @@ describe OpenStudio::Aws::Aws do
243
226
  @aws.create_workers(0, options)
244
227
 
245
228
  h = @aws.os_aws.server.to_os_hash
246
-
247
- shell = @aws.server.shell_command('df -h | grep /dev/xvdb.*/mnt')
248
- expect(shell).not_to be_nil
249
- expect(shell).to eq /\/dev\/xvdb.*\/mnt/
229
+ expect(h[:group_id]).to be_a String
230
+ expect(h[:group_id]).to match /^[\d\S]{32}$/
231
+ expect(h[:location]).to eq 'AWS'
250
232
  ensure
251
233
  @aws.terminate_instances_by_group_id(h[:group_id])
252
234
  end
253
235
  end
254
236
  end
237
+
238
+ context 'key locations' do
239
+ before :all do
240
+ FileUtils.rm_rf 'spec/output/save_path'
241
+
242
+ @config = OpenStudio::Aws::Config.new
243
+ options = {
244
+ save_directory: 'spec/output/save_path'
245
+ }
246
+ @aws = OpenStudio::Aws::Aws.new(options)
247
+
248
+ @group_id = nil
249
+ end
250
+
251
+ it 'should allow a different location for saving aws config files' do
252
+ begin
253
+ options = {
254
+ instance_type: 'm3.medium',
255
+ image_id: SERVER_AMI
256
+ }
257
+
258
+ expect(@aws.save_directory).to eq File.join(File.expand_path('.'), 'spec/output/save_path')
259
+
260
+ @aws.create_server(options)
261
+
262
+ @aws.save_cluster_info "#{@aws.save_directory}/server_data.json"
263
+
264
+ expect(File.exist?('spec/output/save_path/ec2_server_key.pem')).to be true
265
+ expect(File.exist?('spec/output/save_path/ec2_worker_key.pem')).to be true
266
+ expect(File.exist?('spec/output/save_path/ec2_worker_key.pub')).to be true
267
+ expect(File.exist?('spec/output/save_path/server_data.json')).to be true
268
+
269
+ expect(@aws.os_aws.server).not_to be_nil
270
+ expect(@aws.os_aws.server.data.availability_zone).to match /us-east-../
271
+
272
+ h = @aws.os_aws.server.to_os_hash
273
+ expect(h[:group_id]).to be_a String
274
+ expect(h[:group_id]).to match /^[\d\S]{32}$/
275
+ @group_id = h[:group_id]
276
+ ensure
277
+ @aws.terminate_instances_by_group_id(@group_id)
278
+ end
279
+
280
+ # verify that the instances are dead -- how?
281
+ end
282
+ end
255
283
  end
@@ -43,6 +43,15 @@ describe OpenStudioAmis do
43
43
  end
44
44
 
45
45
  context 'version 2' do
46
+ it 'should return openstudio version 1.7.1 stable & default versions correctly when 1.7.5 is passed' do
47
+ a = OpenStudioAmis.new(2, openstudio_version: '1.7.5', stable: true)
48
+
49
+ amis = a.get_amis
50
+
51
+ expect(amis[:server]).to eq('ami-845a54ec')
52
+ expect(amis[:worker]).to eq('ami-3a5a5452')
53
+ end
54
+
46
55
  it 'should return openstudio version 1.7.1 stable & default versions correctly' do
47
56
  a = OpenStudioAmis.new(2, openstudio_version: '1.7.1')
48
57
 
@@ -80,6 +80,18 @@ describe OpenStudio::Aws::Aws do
80
80
 
81
81
  expect { aws.create_server(options) }.to raise_error /Must pass in the private_key_file_name/
82
82
  end
83
+
84
+ it 'should create a key in another directory' do
85
+ options = {}
86
+ aws = OpenStudio::Aws::Aws.new
87
+ expect(aws.save_directory).to eq File.expand_path('.')
88
+
89
+ options = {
90
+ save_directory: 'spec/output/save_path'
91
+ }
92
+ aws = OpenStudio::Aws::Aws.new(options)
93
+ expect(aws.save_directory).to eq File.join(File.expand_path('.'), 'spec/output/save_path')
94
+ end
83
95
  end
84
96
 
85
97
  context 'proxy configuration' do
@@ -92,7 +104,6 @@ describe OpenStudio::Aws::Aws do
92
104
  }
93
105
 
94
106
  @aws = OpenStudio::Aws::Aws.new(options)
95
- # puts @aws.inspect
96
107
  expect(@aws.os_aws).not_to be_nil
97
108
  end
98
109
 
@@ -140,4 +151,15 @@ describe OpenStudio::Aws::Aws do
140
151
  expect(az[:availability_zone_info].first[:zone_name]).to eq 'us-east-1a'
141
152
  end
142
153
  end
154
+
155
+ context 'total instances' do
156
+ it 'should describe the total instances' do
157
+ options = {}
158
+ aws = OpenStudio::Aws::Aws.new(options)
159
+ az = aws.total_instances_count
160
+
161
+ expect(az[:total_instances]).to_not be_nil
162
+ expect(az[:region]).to_not be_nil
163
+ end
164
+ end
143
165
  end
@@ -5,7 +5,7 @@ describe OpenStudioAwsWrapper do
5
5
  context 'unauthenticated session' do
6
6
  it 'should fail to authenticate' do
7
7
  options = {
8
- credentials: {
8
+ credentials: {
9
9
  access_key_id: 'some_random_access_key_id',
10
10
  secret_access_key: 'some_super_secret_access_key',
11
11
  region: 'us-east-1',
@@ -42,7 +42,7 @@ describe OpenStudioAwsWrapper do
42
42
  end
43
43
 
44
44
  it 'should list number of instances' do
45
- resp = @aws.os_aws.describe_total_instances
45
+ resp = @aws.os_aws.total_instances_count
46
46
  expect(resp).not_to be_nil
47
47
  end
48
48
  end
@@ -103,6 +103,7 @@ describe OpenStudioAwsWrapper do
103
103
 
104
104
  it 'should create security group' do
105
105
  sg = @aws.os_aws.create_or_retrieve_default_security_group
106
+ pp sg
106
107
  expect(sg).to_not be nil
107
108
  end
108
109
  end