openstudio-aws 0.4.0.pre1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 71ac07185a92efb6e2198f3003ef61c073a2a643
4
- data.tar.gz: fd9c920fd7ed2262d455f052889dccff022fca8f
3
+ metadata.gz: 8b9a12cd70bc592eb64710b398e0dd40bf3cdcd6
4
+ data.tar.gz: 5510348a79a4a5d21fb1ca2b264bc750c7868c62
5
5
  SHA512:
6
- metadata.gz: 0272b732564bcef0a8e296912108d19c135334cb90b200e1f414a976de0115ae305288015996d77f22ccd403b39b93632dfb1fc9485c1d5e8b43dc4547b3b37a
7
- data.tar.gz: 4f17fb88a5780718a9fa227a804640ee903e5d15e0e8fb48dae9d230d3da7edcde12079d0496261c915a725e94866d4b03c7b6d7bbe9f8ed29cc9a73d4ceb436
6
+ metadata.gz: 86d37f406f4bb02abd473be6a6b58e5f5ae29e676cb6a87e06723ced3664170844d1817c9081aa9429e3149b7d624a4ff61fe8a300124246bd35224493f19d81
7
+ data.tar.gz: 573698fb2edfc82c380d17fb2a9b09f21c47fef6c25cebe0ecb260ab1f1f631eecf9ba9ba5ba71fa50c7033ff39bce0e88b0094356973c94b839230f0dae371f
data/.gitignore CHANGED
@@ -17,4 +17,5 @@ spec/reports
17
17
  rubocop-results.xml
18
18
  spec/output
19
19
  *.pem
20
- *.pub
20
+ *.pub
21
+ *.config
data/.travis.yml CHANGED
@@ -1,7 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.1.7
3
4
  - 2.0.0
4
- - 1.9.3
5
- - jruby-19mode # JRuby in 1.9 mode
6
5
  script:
7
6
  - bundle exec rake spec:no_auth
data/CHANGELOG.md CHANGED
@@ -1,23 +1,14 @@
1
1
  OpenStudio AWS Gem Change Log
2
2
  ==================================
3
3
 
4
- Version 0.4.0-pre1
4
+ Version 0.4.0
5
5
  -------------
6
6
  * When listing the AMI, allow future versions of OpenStudio to return the latest stable version
7
-
8
- Version 0.4.0.alpha3
9
- -------------
10
- * Load the key name and security groups from the AWS instance information.
7
+ * Load the key name and security groups from the AWS instance information.
11
8
  * Add method on Aws to get the group_uuid
12
-
13
- Version 0.4.0.alpha2
14
- -------------
15
9
  * Load worker keys from disk (if they exist) when constructing the OpenStudioAwsWrapper class
16
10
  * Have `total_instances_count` return the region and first availability zone
17
11
  * Add `describe_all_instances`
18
-
19
- Version 0.4.0.alpha1
20
- -------------
21
12
  * Add a stable JSON file that can be used to flag which versions of the server are stable (used by OpenStudio PAT).
22
13
  * Remove all puts and replace with logger. This is required because OpenStudio PAT reads the result from the command line.
23
14
  * Add the method `describe_availability_zones` to the root AWS class
@@ -26,7 +17,15 @@ Version 0.4.0.alpha1
26
17
  * Add method to `delete_key_pair`
27
18
  * Add launch time to the server data struct
28
19
  * Add cloud watch class to calculate the cost
29
- * Add save_directory to override the default path to save private keys and server configuration files
20
+ * Add save_directory to override the default path to save private keys and server configuration files
21
+ * Remove old AMIs in the AMI List (versions with 0.0.x)
22
+ * Place previous stable AMI version in the list for OpenStudio
23
+ * Remove support for Ruby 1.9. Add support for Ruby 2.1.
24
+
25
+ Version 0.3.2
26
+ -------------
27
+ * Prefer use of the access and secret key in the environment variables if defined
28
+ * Support i2 instance ephemeral storage. These instances will take a bit longer to startup because the volumes are not yet created.
30
29
 
31
30
  Version 0.3.1
32
31
  -------------
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source 'http://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  group :test do
6
- gem 'rspec', '~> 3.2.0'
6
+ gem 'rspec', '~> 3.3'
7
7
  gem 'ci_reporter_rspec'
8
8
  gem 'rubocop', '~> 0.31'
9
9
  gem 'rubocop-checkstyle_formatter', '~> 0.2'
@@ -307,6 +307,13 @@ module OpenStudio
307
307
  @os_cloudwatch.estimated_charges
308
308
  end
309
309
 
310
+ # Stop the entire cluster
311
+ def stop
312
+ puts "Stoping any instance with group ID: #{@os_aws.group_uuid}"
313
+
314
+ stop_instances_by_group_id(@os_aws.group_uuid)
315
+ end
316
+
310
317
  # Stop running instances
311
318
  #
312
319
  # @param group_id [String] The unique group identifier for the OpenStudio cluster.
@@ -320,6 +327,17 @@ module OpenStudio
320
327
  resp
321
328
  end
322
329
 
330
+ # Warning, it appears that this stops all the instances
331
+ def stop_instances_by_group_id(group_id)
332
+ instances = @os_aws.describe_running_instances(group_id)
333
+ ids = instances.map { |k, _| k[:instance_id] }
334
+
335
+ puts "Stoping the following instances #{ids}"
336
+ resp = []
337
+ resp = @os_aws.stop_instances(ids).to_hash unless ids.empty?
338
+ resp
339
+ end
340
+
323
341
  # @params(ids): array of instance ids
324
342
  def terminate_instances(ids)
325
343
  logger.info "Terminating the following instances #{ids}"
@@ -328,7 +346,7 @@ module OpenStudio
328
346
  resp
329
347
  end
330
348
 
331
- # Warning, this appears that it terminates all the instances
349
+ # Warning, it appears that this terminates all the instances
332
350
  def terminate_instances_by_group_id(group_id)
333
351
  fail 'Group ID not defined' unless group_id
334
352
 
@@ -1,38 +1,57 @@
1
1
  module OpenStudio
2
2
  module Aws
3
3
  class Config
4
+ include Logging
5
+
4
6
  attr_accessor :access_key
5
7
  attr_accessor :secret_key
6
8
 
7
9
  def initialize(yml_config_file = nil)
8
- @yml_config_file = yml_config_file
9
- @config = nil
10
+ # If the AWS keys are set in the env variable and the yml_config_file is nil, then use those keys
11
+ @access_key = ENV['AWS_ACCESS_KEY_ID'] if ENV['AWS_ACCESS_KEY_ID']
12
+ @secret_key = ENV['AWS_SECRET_ACCESS_KEY'] if ENV['AWS_SECRET_ACCESS_KEY']
13
+
14
+ if @access_key && @secret_key && yml_config_file.nil?
15
+ logger.info 'Using AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY from environment variables'
16
+ else
17
+ # Otherwise read the file
18
+ logger.info 'Reading AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY from aws config file'
19
+
20
+ @yml_config_file = yml_config_file
21
+ @config = nil
22
+
23
+ @yml_config_file = File.join(File.expand_path('~'), 'aws_config.yml') if @yml_config_file.nil?
10
24
 
11
- if @yml_config_file.nil?
12
- @yml_config_file = File.join(File.expand_path('~'), 'aws_config.yml')
13
25
  unless File.exist?(@yml_config_file)
14
26
  write_config_file
15
- fail "No Config File in user home directory. A template has been added, please edit and save: #{@yml_config_file}"
27
+ fail "Config file not found. A template has been added, please edit and save: #{@yml_config_file}"
16
28
  exit 1
17
29
  end
18
- end
19
30
 
20
- begin
21
- @config = YAML.load(File.read(@yml_config_file))
22
- @access_key = @config['access_key_id']
23
- @secret_key = @config['secret_access_key']
24
- rescue
25
- raise "Couldn't read config file #{@yml_config_file}. Delete file then recreate by rerunning script"
31
+ begin
32
+ @config = YAML.load(File.read(@yml_config_file))
33
+
34
+ # always convert to symbolized hash
35
+ @config = @config.inject({}) { |a, (k, v)| a[k.to_sym] = v; a }
36
+
37
+ @access_key = @config[:access_key_id]
38
+ @secret_key = @config[:secret_access_key]
39
+ rescue
40
+ raise "Couldn't read config file #{@yml_config_file}. Delete file then recreate by rerunning script"
41
+ end
26
42
  end
27
43
  end
28
44
 
29
45
  private
30
46
 
31
47
  def write_config_file
32
- File.open(@yml_config_file, 'w') do |f|
33
- f << "access_key_id: YOUR_ACCESS_KEY_ID\n"
34
- f << "secret_access_key: YOUR_SECRET_ACCESS_KEY\n"
35
- end
48
+ # create the file
49
+ data = {
50
+ access_key_id: 'YOUR_ACCESS_KEY_ID',
51
+ secret_access_key: 'YOUR_SECRET_ACCESS_KEY'
52
+ }
53
+
54
+ File.open(@yml_config_file, 'w') { |f| f << data.to_yaml }
36
55
  end
37
56
  end
38
57
  end
@@ -1,5 +1,5 @@
1
1
  module OpenStudio
2
2
  module Aws
3
- VERSION = '0.4.0.pre1'
3
+ VERSION = '0.4.0'
4
4
  end
5
5
  end
@@ -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
@@ -119,10 +118,11 @@ class OpenStudioAmis
119
118
  stable = nil
120
119
  if json[:openstudio][@options[:openstudio_version].to_sym]
121
120
  stable = json[:openstudio][@options[:openstudio_version].to_sym][:stable]
121
+ logger.info "The stable version in the JSON is #{stable}"
122
122
  end
123
123
 
124
124
  if stable
125
- value = json[:openstudio][@options[:openstudio_version].to_sym][stable.to_sym]
125
+ value = json[:openstudio_server][stable.to_sym]
126
126
  amis = value[:amis]
127
127
  else
128
128
  logger.info "Could not find a stable version for OpenStudio version #{@options[:openstudio_version]}. "\
@@ -130,12 +130,14 @@ class OpenStudioAmis
130
130
 
131
131
  json[:openstudio].each do |os_version, values|
132
132
  next if os_version == :default
133
+
133
134
  if values.key? :stable
134
135
  # don't check versions newer than what we are requesting
135
136
  next if os_version.to_s.to_version > @options[:openstudio_version].to_s.to_version
137
+
136
138
  stable = json[:openstudio][os_version][:stable]
137
139
  logger.info "Found a stable version for OpenStudio version #{os_version} with OpenStudio Server version #{stable}"
138
- value = values[stable.to_sym]
140
+ value = json[:openstudio_server][stable.to_sym]
139
141
  amis = value[:amis]
140
142
 
141
143
  break
@@ -1,5 +1,10 @@
1
1
  {
2
2
  "openstudio": {
3
+ "1.9.1": "1.12.13",
4
+ "1.9.0": "1.12.12",
5
+ "1.8.4": "1.12.5",
6
+ "1.8.3": "1.12.4",
7
+ "1.8.2": "1.12.3",
3
8
  "1.8.1": "1.12.2",
4
9
  "1.8.0": "1.12.1",
5
10
  "1.7.1": "1.11.0-rc3",
@@ -1,5 +1,5 @@
1
1
  ######################################################################
2
- # Copyright (c) 2008-2014, Alliance for Sustainable Energy.
2
+ # Copyright (c) 2008-2015, Alliance for Sustainable Energy.
3
3
  # All rights reserved.
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
@@ -35,7 +35,7 @@ class OpenStudioAwsInstance
35
35
  @key_pair_name = key_pair_name
36
36
  @security_groups = security_groups
37
37
  @group_uuid = group_uuid.to_s
38
- @init_timestamp = Time.now # This is the timestamp and is typically just tracked for the server
38
+ @init_timestamp = Time.now # This is the timestamp and is typically just tracked for the server
39
39
  @private_key = private_key
40
40
  @private_key_file_name = private_key_file_name
41
41
  @proxy = proxy
@@ -390,7 +390,7 @@ class OpenStudioAwsInstance
390
390
  rescue SystemCallError, Timeout::Error => e
391
391
  # port 22 might not be available immediately after the instance finishes launching
392
392
  sleep 10
393
- logger.info('Timeout. Perhaps there is a communication error to EC2? Will try again')
393
+ logger.info('Timeout. Perhaps there is a communication error to EC2? Will try again in 10 seconds')
394
394
  retry
395
395
  end
396
396
 
@@ -17,24 +17,6 @@
17
17
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
18
  ######################################################################
19
19
 
20
- ######################################################################
21
- # == Synopsis
22
- #
23
- # Uses the aws-sdk gem to communicate with AWS
24
- #
25
- # == Usage
26
- #
27
- # ruby aws.rb access_key secret_key us-east-1 EC2 launch_server "{\"instance_type\":\"t1.micro\"}"
28
- #
29
- # ARGV[0] - Access Key
30
- # ARGV[1] - Secret Key
31
- # ARGV[2] - Region
32
- # ARGV[3] - Service (e.g. "EC2" or "CloudWatch")
33
- # ARGV[4] - Command (e.g. "launch_server")
34
- # ARGV[5] - Optional json with parameters associated with command
35
- #
36
- ######################################################################
37
-
38
20
  require_relative 'openstudio_aws_logger'
39
21
 
40
22
  class OpenStudioAwsWrapper
@@ -53,8 +35,7 @@ class OpenStudioAwsWrapper
53
35
  VALID_OPTIONS = [:proxy, :credentials]
54
36
 
55
37
  def initialize(options = {}, group_uuid = nil)
56
- @group_uuid = group_uuid || (SecureRandom.uuid).gsub('-', '')
57
- logger.info "GroupUUID is #{@group_uuid}"
38
+ @group_uuid = group_uuid || (SecureRandom.uuid).delete('-')
58
39
 
59
40
  @security_groups = []
60
41
  @key_pair_name = nil
@@ -218,22 +199,17 @@ class OpenStudioAwsWrapper
218
199
  instance_data
219
200
  end
220
201
 
221
- def describe_amis(filter = nil, image_ids = [], owned_by_me = true)
202
+ # Describe the list of AMIs adn return the hash.
203
+ # @param [Array] image_ids: List of image ids to find. If empty, then will find all images.
204
+ # @param [Boolean] owned_by_me: Find only the images owned by the current user?
205
+ # @return [Hash]
206
+ def describe_amis(image_ids = [], owned_by_me = true)
222
207
  resp = nil
223
208
 
224
- # TODO: test the filter. i don't think that it is exposed in the AWS gem?
225
209
  if owned_by_me
226
- if filter
227
- resp = @aws.describe_images(owners: [:self], filter: filter).data
228
- else
229
- resp = @aws.describe_images(owners: [:self]).data
230
- end
210
+ resp = @aws.describe_images(owners: [:self]).data
231
211
  else
232
- if filter
233
- resp = @aws.describe_images(filter: filter).data
234
- else
235
- resp = @aws.describe_images(image_ids: image_ids).data
236
- end
212
+ resp = @aws.describe_images(image_ids: image_ids).data
237
213
  end
238
214
 
239
215
  resp = resp.to_hash
@@ -242,11 +218,15 @@ class OpenStudioAwsWrapper
242
218
  resp[:images].each do |image|
243
219
  image[:tags_hash] = {}
244
220
  image[:tags_hash][:tags] = []
245
- image[:tags].each do |tag|
246
- if tag[:value]
247
- image[:tags_hash][tag[:key].to_sym] = tag[:value]
248
- else
249
- image[:tags_hash][:tags] << tag[:key]
221
+
222
+ # If the image is being created then its tags may be empty
223
+ if image[:tags]
224
+ image[:tags].each do |tag|
225
+ if tag[:value]
226
+ image[:tags_hash][tag[:key].to_sym] = tag[:value]
227
+ else
228
+ image[:tags_hash][:tags] << tag[:key]
229
+ end
250
230
  end
251
231
  end
252
232
  end
@@ -254,6 +234,8 @@ class OpenStudioAwsWrapper
254
234
  resp
255
235
  end
256
236
 
237
+ # Stop specific instances based on the instance_ids
238
+ # @param [Array] ids: Array of ids to stop
257
239
  def stop_instances(ids)
258
240
  resp = @aws.stop_instances(
259
241
  instance_ids: ids,
@@ -549,8 +531,6 @@ class OpenStudioAwsWrapper
549
531
 
550
532
  # now grab the good keys - they should be sorted newest to older... so go backwards
551
533
  amis[:openstudio_server].keys.reverse_each do |key|
552
- next if amis[:openstudio_server][key][:deprecate]
553
-
554
534
  a = amis[:openstudio_server][key]
555
535
  # this will override any of the old ami/os version
556
536
  version1[a[:openstudio_version].to_sym] = a[:amis]
@@ -568,20 +548,33 @@ class OpenStudioAwsWrapper
568
548
  # don't need to transform anything right now, only flag which ones are stable version so that the uploaded ami JSON has the
569
549
  # stable server for OpenStudio PAT to use.
570
550
  stable = JSON.parse File.read(File.join(File.dirname(__FILE__), 'ami_stable_version.json')), symbolize_names: true
571
- # go through and tag the versions of the openstudio instances that are stable
572
551
 
552
+ # go through and tag the versions of the openstudio instances that are stable,
573
553
  stable[:openstudio].each do |k, v|
574
554
  if amis[:openstudio][k.to_s] && amis[:openstudio][k.to_s][v.to_sym]
575
555
  amis[:openstudio][k.to_s][:stable] = v
576
556
  end
577
557
  end
578
558
 
559
+ # I'm not sure what the below code is trying to accomplish. Are we even using the default?
579
560
  k, v = stable[:openstudio].first
580
561
  if k && v
581
562
  if amis[:openstudio][k.to_s]
582
563
  amis[:openstudio][:default] = v
583
564
  end
584
565
  end
566
+
567
+ # now go through and if the OpenStudio version does not have a stable key, then assign it the most recent
568
+ # stable AMI. This allows for easy testing so a new version of OpenStudio can use an existing AMI.
569
+ stable[:openstudio].each do |stable_openstudio, stable_server|
570
+ amis[:openstudio].each do |k, v|
571
+ next if k == :default
572
+
573
+ if k.to_s.to_version > stable_openstudio.to_s.to_version && v[:stable].nil?
574
+ amis[:openstudio][k.to_s][:stable] = stable_server.to_s
575
+ end
576
+ end
577
+ end
585
578
  end
586
579
 
587
580
  amis
@@ -606,7 +599,8 @@ class OpenStudioAwsWrapper
606
599
  h
607
600
  end
608
601
 
609
- # take the base version and increment the patch until
602
+ # take the base version and increment the patch until.
603
+ # TODO: DEPRECATE
610
604
  def get_next_version(base, list_of_svs)
611
605
  b = base.to_version
612
606
 
@@ -634,8 +628,8 @@ class OpenStudioAwsWrapper
634
628
  sv = ami[:tags_hash][:openstudio_server_version]
635
629
 
636
630
  if sv.nil? || sv == ''
637
- logger.info 'found nil version, incrementing from 0.0.1'
638
- sv = get_next_version('0.0.1', list_of_svs)
631
+ logger.info 'found nil Server Version, ignoring'
632
+ next
639
633
  end
640
634
  list_of_svs << sv
641
635
 
@@ -646,11 +640,9 @@ class OpenStudioAwsWrapper
646
640
  a[:amis] = {} unless a[:amis]
647
641
 
648
642
  # fill in data (this will override data currently)
649
- a[:deprecate] = true if sv.to_version.satisfies('0.0.*')
650
643
  a[:openstudio_version] = ami[:tags_hash][:openstudio_version] if ami[:tags_hash][:openstudio_version]
651
644
  a[:openstudio_version_sha] = ami[:tags_hash][:openstudio_version_sha] if ami[:tags_hash][:openstudio_version_sha]
652
645
  a[:user_uuid] = ami[:tags_hash][:user_uuid] if ami[:tags_hash][:user_uuid]
653
- a[:deprecate] = ami[:tags_hash][:deprecate] if ami[:tags_hash][:deprecate]
654
646
  a[:created_on] = ami[:tags_hash][:created_on] if ami[:tags_hash][:created_on]
655
647
  a[:openstudio_server_version] = sv.to_s
656
648
  if ami[:tags_hash][:tested]
@@ -687,29 +679,8 @@ class OpenStudioAwsWrapper
687
679
  end
688
680
  end
689
681
 
690
- # merge in the existing AMIs the existing amis into the 'unknown category, but don't flag them as 'deprecate'
691
- existing.keys.each do |ami_key|
692
- next if ami_key == 'default'.to_sym # ignore default
693
-
694
- # get next version
695
- next_version = get_next_version('0.0.1', list_of_svs)
696
- list_of_svs << next_version
697
-
698
- amis[:openstudio_server][next_version.to_sym] ||= {}
699
- a = amis[:openstudio_server][next_version.to_sym]
700
- a[:amis] = {} unless a[:amis]
701
-
702
- a[:openstudio_version] = ami_key
703
- a[:amis][:server] = existing[ami_key][:server]
704
- a[:amis][:worker] = existing[ami_key][:worker]
705
- a[:amis][:cc2worker] = existing[ami_key][:cc2worker]
706
- a[:openstudio_server_version] = next_version.to_s
707
- end
708
-
709
682
  # flip these around for openstudio server section
710
683
  amis[:openstudio_server].keys.each do |key|
711
- next if key.to_s.to_version.satisfies('0.0.*')
712
-
713
684
  a = amis[:openstudio_server][key]
714
685
  ov = a[:openstudio_version]
715
686
 
@@ -44,12 +44,28 @@ 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
+
47
50
  # stop the various services that use mongo
48
51
  service delayed_job stop
52
+ supervisorctl stop delayed_job
49
53
  service apache2 stop
50
54
  service mongodb stop
51
55
  service mongod stop
52
56
 
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
+
53
69
  # remove mongo db & add it back
54
70
  mkdir -p /mnt/mongodb/data
55
71
  chown mongodb:nogroup /mnt/mongodb/data
@@ -118,9 +134,11 @@ find /mnt/openstudio -type f -print0 | xargs -0 chmod 664
118
134
 
119
135
  # restart rserve
120
136
  service Rserve restart
137
+ supervisorctl restart Rserve
121
138
 
122
- # restart delayed jobs
139
+ # start delayed jobs
123
140
  service delayed_job start
141
+ supervisorctl start delayed_job
124
142
 
125
143
  #file flag the user_data has completed
126
144
  cat /dev/null > /home/ubuntu/user_data_done
@@ -35,6 +35,18 @@ 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
+
38
50
  ## Worker Data Configuration -- On Vagrant this is a separate file
39
51
 
40
52
  rm -f /tmp/snow.log
@@ -63,14 +75,11 @@ find /mnt/openstudio -type f -print0 | xargs -0 chmod 664
63
75
 
64
76
  ## End Worker Data Configuration
65
77
 
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
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
74
83
 
75
84
  #file flag the user_data has completed
76
85
  cat /dev/null > /home/ubuntu/user_data_done
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
14
14
  s.description = 'Custom classes for configuring clusters for OpenStudio & EnergyPlus analyses'
15
15
  s.license = 'LGPL'
16
16
 
17
- s.required_ruby_version = '>= 1.9.1'
17
+ s.required_ruby_version = '>= 2.0.0'
18
18
  s.required_rubygems_version = '>= 1.3.6'
19
19
 
20
20
  s.add_dependency 'net-scp', '~> 1.1'
@@ -22,7 +22,6 @@ Gem::Specification.new do |s|
22
22
  s.add_dependency 'semantic', '~> 1.4'
23
23
  s.add_dependency 'sshkey', '~> 1.7'
24
24
 
25
- s.add_development_dependency 'bundler', '~> 1.7'
26
25
  s.add_development_dependency 'rake', '~> 10.4'
27
26
 
28
27
  s.files = `git ls-files -z`.split("\x0")
@@ -252,7 +252,11 @@ describe OpenStudio::Aws::Aws do
252
252
  begin
253
253
  options = {
254
254
  instance_type: 'm3.medium',
255
- image_id: SERVER_AMI
255
+ image_id: SERVER_AMI,
256
+ tags: [
257
+ 'ci_tests=true',
258
+ 'ServerOnly=true'
259
+ ]
256
260
  }
257
261
 
258
262
  expect(@aws.save_directory).to eq File.join(File.expand_path('.'), 'spec/output/save_path')
@@ -344,4 +348,45 @@ describe OpenStudio::Aws::Aws do
344
348
  @aws.terminate
345
349
  end
346
350
  end
351
+
352
+ context 'i2-instances' do
353
+ before :all do
354
+ @config = OpenStudio::Aws::Config.new
355
+ @aws = OpenStudio::Aws::Aws.new
356
+
357
+ @group_id = nil
358
+ end
359
+
360
+ it 'should create an i2 instance and mount the storage' do
361
+ begin
362
+ options = {
363
+ instance_type: 'i2.xlarge',
364
+ image_id: SERVER_AMI,
365
+ tags: [
366
+ 'ci_tests=true',
367
+ 'ServerOnly=true'
368
+ ]
369
+ }
370
+
371
+ expect { @aws.create_workers(0) }.to raise_error "Can't create workers without a server instance running"
372
+
373
+ test_pem_file = 'ec2_server_key.pem'
374
+ FileUtils.rm_f test_pem_file if File.exist? test_pem_file
375
+ FileUtils.rm_f 'server_data.json' if File.exist? 'server_data.json'
376
+
377
+ @aws.create_server(options)
378
+
379
+ # Still have to call "create workers" or the configuration won't happen.
380
+ @aws.create_workers(0, options)
381
+
382
+ h = @aws.os_aws.server.to_os_hash
383
+
384
+ shell = @aws.server.shell_command('df -h | grep /dev/xvdb.*/mnt')
385
+ expect(shell).not_to be_nil
386
+ expect(shell).to eq /\/dev\/xvdb.*\/mnt/
387
+ ensure
388
+ @aws.terminate_instances_by_group_id(h[:group_id])
389
+ end
390
+ end
391
+ end
347
392
  end
@@ -43,7 +43,7 @@ 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
46
+ it 'should return openstudio version 1.7.1 when stable is passed to 1.7.5' do
47
47
  a = OpenStudioAmis.new(2, openstudio_version: '1.7.5', stable: true)
48
48
 
49
49
  amis = a.get_amis
@@ -49,12 +49,12 @@ describe OpenStudioAwsWrapper do
49
49
 
50
50
  context 'create new ami json' do
51
51
  it 'should describe existing AMIs' do
52
- resp = @aws.os_aws.describe_amis(nil, nil, true)
53
- expect(resp[:images].length).to be >= 3
52
+ resp = @aws.os_aws.describe_amis
53
+ expect(resp[:images].length).to be >= 10
54
54
  end
55
55
 
56
56
  it 'should describe a specific image' do
57
- resp = @aws.os_aws.describe_amis(nil, ['ami-39bb8750'], false)
57
+ resp = @aws.os_aws.describe_amis(['ami-39bb8750'], false)
58
58
  expect(resp[:images].first[:image_id]).to eq('ami-39bb8750')
59
59
  expect(resp[:images].first[:tags_hash][:user_uuid]).to eq('jenkins-139LADFJ178')
60
60
  expect(resp[:images].first[:tags_hash][:openstudio_server_version]).to eq('1.3.1')
@@ -62,10 +62,10 @@ describe OpenStudioAwsWrapper do
62
62
  end
63
63
 
64
64
  context 'version 1' do
65
- it 'should create a new json' do
65
+ it 'should create a new json and return the right server versions' do
66
66
  resp = @aws.os_aws.create_new_ami_json(1)
67
- expect(resp['1.1.3'.to_sym][:server]).to eq('ami-fb301292')
68
67
  expect(resp['1.2.1'.to_sym][:server]).to eq('ami-89744be0')
68
+ expect(resp['1.9.0'.to_sym][:server]).to eq('ami-f3611996')
69
69
  expect(resp['default'.to_sym][:server]).to_not eq('ami-89744be0')
70
70
  end
71
71
  end
@@ -103,7 +103,6 @@ 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
107
106
  expect(sg).to_not be nil
108
107
  end
109
108
  end
@@ -6,5 +6,49 @@ describe OpenStudio::Aws::Config do
6
6
  @config = OpenStudio::Aws::Config.new
7
7
  expect(@config).not_to be_nil
8
8
  end
9
+
10
+ it 'should create a new file' do
11
+ local_file = 'test.config'
12
+ File.delete local_file if File.exist? local_file
13
+
14
+ expect { OpenStudio::Aws::Config.new local_file }.to raise_error /Config file not found. A template has been added, please edit and save: test.config/
15
+ expect(File.exist?(local_file)).to eq true
16
+
17
+ # read the file and make sure that the template is there
18
+ config = YAML.load(File.read(local_file))
19
+ expect(config[:access_key_id]).to eq 'YOUR_ACCESS_KEY_ID'
20
+ expect(config[:secret_access_key]).to eq 'YOUR_SECRET_ACCESS_KEY'
21
+ end
22
+
23
+ it 'should read old format' do
24
+ # make sure that we can read the old format which has non-symoblized keys
25
+ local_file = 'test_custom_old.config'
26
+
27
+ data = {
28
+ 'access_key_id' => 'abcd',
29
+ 'secret_access_key' => 'efgh'
30
+ }
31
+
32
+ File.open(local_file, 'w') { |f| f << data.to_yaml }
33
+ config = OpenStudio::Aws::Config.new local_file
34
+ expect(config.access_key).to eq 'abcd'
35
+ expect(config.secret_key).to eq 'efgh'
36
+ end
37
+
38
+ it 'should read a custom file' do
39
+ local_file = 'test_custom.config'
40
+
41
+ # create the file
42
+ data = {
43
+ access_key_id: 'random_key',
44
+ secret_access_key: 'random_secret_key'
45
+ }
46
+
47
+ File.open(local_file, 'w') { |f| f << data.to_yaml }
48
+
49
+ config = OpenStudio::Aws::Config.new local_file
50
+ expect(config.access_key).to eq 'random_key'
51
+ expect(config.secret_key).to eq 'random_secret_key'
52
+ end
9
53
  end
10
54
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0.pre1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicholas Long
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-24 00:00:00.000000000 Z
11
+ date: 2015-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-scp
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.7'
69
- - !ruby/object:Gem::Dependency
70
- name: bundler
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- version: '1.7'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ~>
81
- - !ruby/object:Gem::Version
82
- version: '1.7'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: rake
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -146,7 +132,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
132
  requirements:
147
133
  - - '>='
148
134
  - !ruby/object:Gem::Version
149
- version: 1.9.1
135
+ version: 2.0.0
150
136
  required_rubygems_version: !ruby/object:Gem::Requirement
151
137
  requirements:
152
138
  - - '>='
@@ -154,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
154
140
  version: 1.3.6
155
141
  requirements: []
156
142
  rubyforge_project:
157
- rubygems_version: 2.4.5
143
+ rubygems_version: 2.0.14.1
158
144
  signing_key:
159
145
  specification_version: 4
160
146
  summary: Start AWS EC2 instances for running distributed OpenStudio-based analyses