openstudio-aws 0.7.0.alpha0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +4 -127
- data/.travis.yml +1 -2
- data/CHANGELOG.md +10 -0
- data/Gemfile +2 -2
- data/Rakefile +39 -4
- data/lib/openstudio/aws/aws.rb +32 -26
- data/lib/openstudio/aws/config.rb +3 -3
- data/lib/openstudio/aws/version.rb +36 -1
- data/lib/openstudio/core_ext/hash.rb +35 -0
- data/lib/openstudio/lib/ami_list.rb +21 -16
- data/lib/openstudio/lib/openstudio_aws_instance.rb +59 -23
- data/lib/openstudio/lib/openstudio_aws_logger.rb +2 -2
- data/lib/openstudio/lib/openstudio_aws_wrapper.rb +57 -33
- data/lib/openstudio/lib/openstudio_cloud_watch.rb +5 -4
- data/lib/openstudio-aws.rb +1 -1
- data/openstudio-aws.gemspec +5 -5
- data/spec/aws_instances/aws_spec_api.rb +38 -3
- data/spec/openstudio-aws/ami_list_spec.rb +45 -1
- data/spec/openstudio-aws/aws_instance_spec.rb +52 -1
- data/spec/openstudio-aws/aws_spec.rb +37 -2
- data/spec/openstudio-aws/aws_wrapper_spec.rb +76 -38
- data/spec/openstudio-aws/config_spec.rb +37 -2
- data/spec/openstudio-aws/openstudio_analysis_wrapper_spec.rb +52 -0
- data/spec/spec_helper.rb +35 -0
- data/update_license.rb +68 -0
- metadata +21 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a8f166aa5280130c5e02e2bbca8e7916c5a4f18
|
4
|
+
data.tar.gz: 44e37969328af52966ae23f81a8ee47da2ce006e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3af181f0922fc772948ad6010d40390c654e1f8d04efe688802ea74fd72778f0fa987473990cc2029746446c3a8358b1d05948d50adb677f729d07fd9dc7b68
|
7
|
+
data.tar.gz: 44de6b22099110cda2aced58100800adc3d9a0881cc1b4999cea68544afdefb224a19c43cc696d77903a2c0f0c56fa7b492e90e74e1040bea6e0344812374eca
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,133 +1,10 @@
|
|
1
1
|
AllCops:
|
2
2
|
Exclude:
|
3
3
|
- 'doc/**/*'
|
4
|
+
- 'gems/**/*'
|
4
5
|
|
5
|
-
|
6
|
-
Lint/AmbiguousOperator:
|
7
|
-
Enabled: true
|
8
|
-
|
9
|
-
Lint/BlockAlignment:
|
10
|
-
Enabled: true
|
11
|
-
|
12
|
-
Lint/ParenthesesAsGroupedExpression:
|
13
|
-
Enabled: true
|
14
|
-
|
15
|
-
Lint/RequireParentheses:
|
16
|
-
Enabled: true
|
17
|
-
|
18
|
-
# Offense count: 1
|
19
|
-
Lint/UnreachableCode:
|
20
|
-
Enabled: false
|
21
|
-
|
22
|
-
# Offense count: 51
|
23
|
-
Lint/UselessAssignment:
|
24
|
-
Enabled: true
|
25
|
-
|
26
|
-
# ==================== Styles / Metrics====================
|
27
|
-
# Offense count: 4
|
28
|
-
Metrics/BlockNesting:
|
29
|
-
Max: 4
|
30
|
-
|
31
|
-
# Offense count: 18
|
32
|
-
# Configuration parameters: CountComments.
|
33
|
-
Metrics/ClassLength:
|
34
|
-
Max: 500
|
35
|
-
|
36
|
-
# Offense count: 27
|
37
|
-
Metrics/CyclomaticComplexity:
|
38
|
-
Max: 48
|
39
|
-
|
40
|
-
# Offense count: 974
|
41
|
-
Metrics/LineLength:
|
42
|
-
Max: 1200
|
43
|
-
|
44
|
-
# Offense count: 87
|
45
|
-
# Configuration parameters: CountComments.
|
46
|
-
Metrics/MethodLength:
|
47
|
-
Max: 350
|
48
|
-
|
49
|
-
# Offense count: 1
|
50
|
-
# Configuration parameters: CountKeywordArgs.
|
51
|
-
Metrics/ParameterLists:
|
52
|
-
Max: 8
|
53
|
-
|
54
|
-
# ==================== Disabled on Purpose ====================
|
55
|
-
# Offense count: 3
|
56
|
-
Style/AccessorMethodName:
|
57
|
-
Enabled: true
|
58
|
-
|
59
|
-
# Need to allow indented case statements
|
60
|
-
# Offense count: 9
|
61
|
-
# Configuration parameters: IndentWhenRelativeTo, SupportedStyles, IndentOneStep.
|
62
|
-
Style/CaseIndentation:
|
63
|
-
Enabled: false
|
64
|
-
|
65
|
-
# Offense count: 18
|
66
|
-
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
67
|
-
Style/ClassAndModuleChildren:
|
68
|
-
Enabled: false
|
69
|
-
|
70
|
-
# Offense count: 2
|
71
|
-
Style/ClassVars:
|
72
|
-
Enabled: false
|
73
|
-
|
74
|
-
# Offense count: 42
|
75
|
-
Style/Documentation:
|
6
|
+
Security/YAMLLoad:
|
76
7
|
Enabled: false
|
77
8
|
|
78
|
-
|
79
|
-
|
80
|
-
Enabled: false
|
81
|
-
|
82
|
-
# Offense count: 2
|
83
|
-
# Configuration parameters: AllowedVariables.
|
84
|
-
Style/GlobalVars:
|
85
|
-
Enabled: false
|
86
|
-
|
87
|
-
# Offense count: 7
|
88
|
-
# Configuration parameters: MinBodyLength.
|
89
|
-
Style/GuardClause:
|
90
|
-
Enabled: true
|
91
|
-
|
92
|
-
# Offense count: 17
|
93
|
-
# Configuration parameters: MaxLineLength.
|
94
|
-
Style/IfUnlessModifier:
|
95
|
-
Enabled: false
|
96
|
-
|
97
|
-
# Do NOT enable. For some reason this is catchy any next which I feel are okay.
|
98
|
-
# Offense count: 18
|
99
|
-
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
100
|
-
Style/Next:
|
101
|
-
Enabled: false
|
102
|
-
|
103
|
-
# Do NOT enable this because it appears $? is different than $CHILD_STATUS.
|
104
|
-
# Offense count: 7
|
105
|
-
# Cop supports --auto-correct.
|
106
|
-
Style/SpecialGlobalVars:
|
107
|
-
Enabled: false
|
108
|
-
|
109
|
-
# More Changes per DLM -- pulled from https://github.com/bbatsov/rubocop/blob/master/config/enabled.yml
|
110
|
-
Style/RedundantReturn:
|
111
|
-
Description: 'Do not use return where it is not required.'
|
112
|
-
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-explicit-return'
|
113
|
-
Enabled: false
|
114
|
-
|
115
|
-
Style/NumericLiterals:
|
116
|
-
Description: 'Add underscores to large numeric literals to improve readability.'
|
117
|
-
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscores-in-numerics'
|
118
|
-
Enabled: false
|
119
|
-
|
120
|
-
Lint/UnusedBlockArgument:
|
121
|
-
Description: 'Checks for unused block arguments.'
|
122
|
-
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars'
|
123
|
-
Enabled: false
|
124
|
-
|
125
|
-
Lint/UnusedMethodArgument:
|
126
|
-
Description: 'Checks for unused method arguments.'
|
127
|
-
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars'
|
128
|
-
Enabled: false
|
129
|
-
|
130
|
-
Lint/UselessAssignment:
|
131
|
-
Description: 'Checks for useless assignment to a local variable.'
|
132
|
-
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars'
|
133
|
-
Enabled: false
|
9
|
+
inherit_from:
|
10
|
+
- http://s3.amazonaws.com/openstudio-resources/styles/rubocop.yml
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
OpenStudio AWS Gem Change Log
|
2
2
|
==================================
|
3
3
|
|
4
|
+
|
5
|
+
Version 0.7.0
|
6
|
+
-------------
|
7
|
+
* Fix worker off by one bug
|
8
|
+
* Update Net SSH and Net SCP
|
9
|
+
|
10
|
+
Version 0.5 - 0.6
|
11
|
+
-----------------
|
12
|
+
* These releases did not include change logs
|
13
|
+
|
4
14
|
Version 0.4.2
|
5
15
|
-------------
|
6
16
|
* Fix net-ssh to 3.0.2 because newer version caused infinite loop
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,3 +1,38 @@
|
|
1
|
+
# *******************************************************************************
|
2
|
+
# OpenStudio(R), Copyright (c) 2008-2019, Alliance for Sustainable Energy, LLC.
|
3
|
+
# All rights reserved.
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# (1) Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
#
|
10
|
+
# (2) Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer in the documentation
|
12
|
+
# and/or other materials provided with the distribution.
|
13
|
+
#
|
14
|
+
# (3) Neither the name of the copyright holder nor the names of any contributors
|
15
|
+
# may be used to endorse or promote products derived from this software without
|
16
|
+
# specific prior written permission from the respective party.
|
17
|
+
#
|
18
|
+
# (4) Other than as required in clauses (1) and (2), distributions in any form
|
19
|
+
# of modifications or other derivative works may not use the "OpenStudio"
|
20
|
+
# trademark, "OS", "os", or any other confusingly similar designation without
|
21
|
+
# specific prior written permission from Alliance for Sustainable Energy, LLC.
|
22
|
+
#
|
23
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
24
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
25
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
26
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
|
27
|
+
# GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
28
|
+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
29
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
30
|
+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
31
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
32
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
33
|
+
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
34
|
+
# *******************************************************************************
|
35
|
+
|
1
36
|
require 'bundler'
|
2
37
|
Bundler.setup
|
3
38
|
|
@@ -10,21 +45,21 @@ require 'ci/reporter/rake/rspec'
|
|
10
45
|
# Gem tasks
|
11
46
|
require 'bundler/gem_tasks'
|
12
47
|
|
13
|
-
$LOAD_PATH.unshift File.expand_path('
|
48
|
+
$LOAD_PATH.unshift File.expand_path('lib', __dir__)
|
14
49
|
require 'openstudio-aws'
|
15
50
|
|
16
51
|
RSpec::Core::RakeTask.new('spec') do |spec|
|
17
|
-
spec.rspec_opts =
|
52
|
+
spec.rspec_opts = ['--format', 'progress', '--format', 'CI::Reporter::RSpec']
|
18
53
|
spec.pattern = 'spec/**/*_spec.rb'
|
19
54
|
end
|
20
55
|
|
21
56
|
RSpec::Core::RakeTask.new('spec:api') do |spec|
|
22
|
-
spec.rspec_opts =
|
57
|
+
spec.rspec_opts = ['--format', 'progress', '--format', 'CI::Reporter::RSpec']
|
23
58
|
spec.pattern = 'spec/**/*_spec_api.rb'
|
24
59
|
end
|
25
60
|
|
26
61
|
RSpec::Core::RakeTask.new('spec:no_auth') do |spec|
|
27
|
-
spec.rspec_opts =
|
62
|
+
spec.rspec_opts = ['--format', 'progress', '--format', 'CI::Reporter::RSpec']
|
28
63
|
|
29
64
|
file_list = FileList['spec/**/*_spec.rb']
|
30
65
|
file_list = file_list.exclude('spec/**/aws_wrapper_spec.rb')
|
data/lib/openstudio/aws/aws.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# *******************************************************************************
|
2
|
-
# OpenStudio(R), Copyright (c) 2008-
|
2
|
+
# OpenStudio(R), Copyright (c) 2008-2019, Alliance for Sustainable Energy, LLC.
|
3
3
|
# All rights reserved.
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
5
5
|
# modification, are permitted provided that the following conditions are met:
|
@@ -40,7 +40,7 @@ module OpenStudio
|
|
40
40
|
:proxy, :credentials, :ami_lookup_version, :openstudio_version,
|
41
41
|
:openstudio_server_version, :region, :ssl_verify_peer, :host, :url, :stable,
|
42
42
|
:save_directory, :subnet_id
|
43
|
-
]
|
43
|
+
].freeze
|
44
44
|
|
45
45
|
class Aws
|
46
46
|
include Logging
|
@@ -64,7 +64,7 @@ module OpenStudio
|
|
64
64
|
def initialize(options = {})
|
65
65
|
invalid_options = options.keys - VALID_OPTIONS
|
66
66
|
if invalid_options.any?
|
67
|
-
|
67
|
+
raise ArgumentError, "invalid option(s): #{invalid_options.join(', ')}"
|
68
68
|
end
|
69
69
|
|
70
70
|
# merge in some defaults
|
@@ -87,12 +87,12 @@ module OpenStudio
|
|
87
87
|
|
88
88
|
# populate the credentials
|
89
89
|
options[:credentials] =
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
90
|
+
{
|
91
|
+
access_key_id: config_file.access_key,
|
92
|
+
secret_access_key: config_file.secret_key,
|
93
|
+
region: options[:region],
|
94
|
+
ssl_verify_peer: options[:ssl_verify_peer]
|
95
|
+
}
|
96
96
|
else
|
97
97
|
options[:credentials][:region] = options[:region]
|
98
98
|
options[:credentials][:ssl_verify_peer] = options[:ssl_verify_peer]
|
@@ -111,7 +111,7 @@ module OpenStudio
|
|
111
111
|
@os_aws = OpenStudioAwsWrapper.new(options)
|
112
112
|
@os_cloudwatch = OpenStudioCloudWatch.new(options)
|
113
113
|
|
114
|
-
@dockerized = options[:ami_lookup_version] == 3
|
114
|
+
@dockerized = options[:ami_lookup_version] == 3
|
115
115
|
|
116
116
|
# this will grab the default version of openstudio ami versions
|
117
117
|
# get the arugments for the AMI lookup
|
@@ -157,14 +157,14 @@ module OpenStudio
|
|
157
157
|
end
|
158
158
|
|
159
159
|
if options[:aws_key_pair_name]
|
160
|
-
|
161
|
-
|
160
|
+
raise 'Must pass in the private_key_file_name' unless options[:private_key_file_name]
|
161
|
+
raise "Private key was not found: #{options[:private_key_file_name]}" unless File.exist? options[:private_key_file_name]
|
162
162
|
end
|
163
163
|
|
164
164
|
if options[:security_groups].empty?
|
165
165
|
# if the user has not specified any security groups, then create one called: 'openstudio-server-sg-v2'
|
166
166
|
@os_aws.create_or_retrieve_default_security_group(tmp_name = 'openstudio-server-sg-v2.2',
|
167
|
-
vpc_id=options[:vpc_id])
|
167
|
+
vpc_id = options[:vpc_id])
|
168
168
|
else
|
169
169
|
@os_aws.security_groups = options[:security_groups]
|
170
170
|
end
|
@@ -232,7 +232,8 @@ module OpenStudio
|
|
232
232
|
options[:image_id] = determine_image_type(options[:instance_type])
|
233
233
|
end
|
234
234
|
|
235
|
-
|
235
|
+
raise "Can't create workers without a server instance running" if @os_aws.server.nil?
|
236
|
+
|
236
237
|
user_data_file = @dockerized ? 'worker_script.sh.docker.template' : 'worker_script.sh.template'
|
237
238
|
|
238
239
|
unless number_of_instances == 0
|
@@ -259,8 +260,8 @@ module OpenStudio
|
|
259
260
|
else
|
260
261
|
@os_aws.configure_server_and_workers
|
261
262
|
end
|
262
|
-
rescue => e
|
263
|
-
|
263
|
+
rescue StandardError => e
|
264
|
+
raise "Configuring the cluster failed with error `#{e.message}` in:\n#{e.backtrace.join('\n')}"
|
264
265
|
end
|
265
266
|
end
|
266
267
|
|
@@ -272,7 +273,7 @@ module OpenStudio
|
|
272
273
|
puts ''
|
273
274
|
puts 'Server SSH Command:'
|
274
275
|
puts "ssh -i #{@os_aws.private_key_file_name} ubuntu@#{@os_aws.server.data[:dns]}"
|
275
|
-
if
|
276
|
+
if !@os_aws.workers.empty?
|
276
277
|
puts ''
|
277
278
|
puts 'Worker SSH Command:'
|
278
279
|
@os_aws.workers.each do |worker|
|
@@ -402,7 +403,7 @@ module OpenStudio
|
|
402
403
|
|
403
404
|
# Warning, it appears that this terminates all the instances
|
404
405
|
def terminate_instances_by_group_id(group_id)
|
405
|
-
|
406
|
+
raise 'Group ID not defined' unless group_id
|
406
407
|
|
407
408
|
instances = @os_aws.describe_running_instances(group_id)
|
408
409
|
logger.info instances
|
@@ -423,7 +424,7 @@ module OpenStudio
|
|
423
424
|
end
|
424
425
|
|
425
426
|
def load_instance_info_from_file(filename)
|
426
|
-
|
427
|
+
raise 'Could not find instance description JSON file' unless File.exist? filename
|
427
428
|
|
428
429
|
h = JSON.parse(File.read(filename), symbolize_names: true)
|
429
430
|
if h[:location] == 'AWS'
|
@@ -444,10 +445,12 @@ module OpenStudio
|
|
444
445
|
def upload_file(server_or_workers, local_file, remote_file)
|
445
446
|
case server_or_workers
|
446
447
|
when :server
|
447
|
-
|
448
|
+
raise 'Server node is nil' unless @os_aws.server
|
449
|
+
|
448
450
|
return @os_aws.server.upload_file(local_file, remote_file)
|
449
451
|
when :worker
|
450
|
-
|
452
|
+
raise 'Worker list is empty' if @os_aws.workers.empty?
|
453
|
+
|
451
454
|
return @os_aws.workers.each { |w| w.upload_file(local_file, remote_file) }
|
452
455
|
end
|
453
456
|
end
|
@@ -455,10 +458,12 @@ module OpenStudio
|
|
455
458
|
def shell_command(server_or_workers, command, load_env = true)
|
456
459
|
case server_or_workers
|
457
460
|
when :server
|
458
|
-
|
461
|
+
raise 'Server node is nil' unless @os_aws.server
|
462
|
+
|
459
463
|
return @os_aws.server.shell_command(command, load_env)
|
460
464
|
when :worker
|
461
|
-
|
465
|
+
raise 'Worker list is empty' if @os_aws.workers.empty?
|
466
|
+
|
462
467
|
return @os_aws.workers.each { |w| w.shell_command(command, load_env) }
|
463
468
|
end
|
464
469
|
end
|
@@ -468,10 +473,11 @@ module OpenStudio
|
|
468
473
|
def download_remote_file(server_or_workers, remote_file, local_file)
|
469
474
|
case server_or_workers
|
470
475
|
when :server
|
471
|
-
|
476
|
+
raise 'Server node is nil' unless @os_aws.server
|
477
|
+
|
472
478
|
return @os_aws.server.download_file(remote_file, local_file)
|
473
479
|
when :worker
|
474
|
-
|
480
|
+
raise 'Worker file download is not available'
|
475
481
|
end
|
476
482
|
end
|
477
483
|
|
@@ -498,7 +504,7 @@ module OpenStudio
|
|
498
504
|
def os_aws_file_location
|
499
505
|
# Get the location of the os-aws.rb file. Use the relative path from where this file exists
|
500
506
|
os_aws_file = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'os-aws.rb'))
|
501
|
-
|
507
|
+
raise "os_aws_file does not exist where it is expected: #{os_aws_file}" unless File.exist?(os_aws_file)
|
502
508
|
|
503
509
|
os_aws_file
|
504
510
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# *******************************************************************************
|
2
|
-
# OpenStudio(R), Copyright (c) 2008-
|
2
|
+
# OpenStudio(R), Copyright (c) 2008-2019, Alliance for Sustainable Energy, LLC.
|
3
3
|
# All rights reserved.
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
5
5
|
# modification, are permitted provided that the following conditions are met:
|
@@ -59,7 +59,7 @@ module OpenStudio
|
|
59
59
|
|
60
60
|
unless File.exist?(@yml_config_file)
|
61
61
|
write_config_file
|
62
|
-
|
62
|
+
raise "Config file not found. A template has been added, please edit and save: #{@yml_config_file}"
|
63
63
|
exit 1
|
64
64
|
end
|
65
65
|
|
@@ -71,7 +71,7 @@ module OpenStudio
|
|
71
71
|
|
72
72
|
@access_key = @config[:access_key_id]
|
73
73
|
@secret_key = @config[:secret_access_key]
|
74
|
-
rescue
|
74
|
+
rescue StandardError
|
75
75
|
raise "Couldn't read config file #{@yml_config_file}. Delete file then recreate by rerunning script"
|
76
76
|
end
|
77
77
|
end
|
@@ -1,5 +1,40 @@
|
|
1
|
+
# *******************************************************************************
|
2
|
+
# OpenStudio(R), Copyright (c) 2008-2019, Alliance for Sustainable Energy, LLC.
|
3
|
+
# All rights reserved.
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# (1) Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
#
|
10
|
+
# (2) Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer in the documentation
|
12
|
+
# and/or other materials provided with the distribution.
|
13
|
+
#
|
14
|
+
# (3) Neither the name of the copyright holder nor the names of any contributors
|
15
|
+
# may be used to endorse or promote products derived from this software without
|
16
|
+
# specific prior written permission from the respective party.
|
17
|
+
#
|
18
|
+
# (4) Other than as required in clauses (1) and (2), distributions in any form
|
19
|
+
# of modifications or other derivative works may not use the "OpenStudio"
|
20
|
+
# trademark, "OS", "os", or any other confusingly similar designation without
|
21
|
+
# specific prior written permission from Alliance for Sustainable Energy, LLC.
|
22
|
+
#
|
23
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
24
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
25
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
26
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
|
27
|
+
# GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
28
|
+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
29
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
30
|
+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
31
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
32
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
33
|
+
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
34
|
+
# *******************************************************************************
|
35
|
+
|
1
36
|
module OpenStudio
|
2
37
|
module Aws
|
3
|
-
VERSION = '0.7.0.
|
38
|
+
VERSION = '0.7.0'.freeze
|
4
39
|
end
|
5
40
|
end
|
@@ -1,3 +1,38 @@
|
|
1
|
+
# *******************************************************************************
|
2
|
+
# OpenStudio(R), Copyright (c) 2008-2019, Alliance for Sustainable Energy, LLC.
|
3
|
+
# All rights reserved.
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# (1) Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
#
|
10
|
+
# (2) Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer in the documentation
|
12
|
+
# and/or other materials provided with the distribution.
|
13
|
+
#
|
14
|
+
# (3) Neither the name of the copyright holder nor the names of any contributors
|
15
|
+
# may be used to endorse or promote products derived from this software without
|
16
|
+
# specific prior written permission from the respective party.
|
17
|
+
#
|
18
|
+
# (4) Other than as required in clauses (1) and (2), distributions in any form
|
19
|
+
# of modifications or other derivative works may not use the "OpenStudio"
|
20
|
+
# trademark, "OS", "os", or any other confusingly similar designation without
|
21
|
+
# specific prior written permission from Alliance for Sustainable Energy, LLC.
|
22
|
+
#
|
23
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
24
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
25
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
26
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
|
27
|
+
# GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
28
|
+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
29
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
30
|
+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
31
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
32
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
33
|
+
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
34
|
+
# *******************************************************************************
|
35
|
+
|
1
36
|
# From: https://github.com/rails/rails/blob/001b270611cd9cb653124775899bdbc2548333ab/activesupport/lib/active_support/core_ext/hash/except.rb
|
2
37
|
class Hash
|
3
38
|
# Returns a hash that includes everything but the given keys.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# *******************************************************************************
|
2
|
-
# OpenStudio(R), Copyright (c) 2008-
|
2
|
+
# OpenStudio(R), Copyright (c) 2008-2019, Alliance for Sustainable Energy, LLC.
|
3
3
|
# All rights reserved.
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
5
5
|
# modification, are permitted provided that the following conditions are met:
|
@@ -40,7 +40,7 @@ class OpenStudioAmis
|
|
40
40
|
|
41
41
|
VALID_OPTIONS = [
|
42
42
|
:openstudio_version, :openstudio_server_version, :host, :url, :stable
|
43
|
-
]
|
43
|
+
].freeze
|
44
44
|
|
45
45
|
# Initializer for listing the AMIs and grabbing the correct version of the AMIs based on the OpenStudio version or
|
46
46
|
# OpenStudio Server version.
|
@@ -52,11 +52,11 @@ class OpenStudioAmis
|
|
52
52
|
def initialize(version = 1, options = {})
|
53
53
|
invalid_options = options.keys - VALID_OPTIONS
|
54
54
|
if invalid_options.any?
|
55
|
-
|
55
|
+
raise ArgumentError, "invalid option(s): #{invalid_options.join(', ')}"
|
56
56
|
end
|
57
57
|
|
58
58
|
if options[:openstudio_version] && options[:openstudio_server_version]
|
59
|
-
|
59
|
+
raise 'Must pass only an openstudio_version or openstudio_server_version when looking up AMIs'
|
60
60
|
end
|
61
61
|
|
62
62
|
# merge in some defaults
|
@@ -73,7 +73,7 @@ class OpenStudioAmis
|
|
73
73
|
@options = defaults.merge(options)
|
74
74
|
|
75
75
|
if @options[:openstudio_version] != 'default' && @options[:openstudio_server_version] != 'default'
|
76
|
-
|
76
|
+
raise 'Must pass either the openstudio_version or openstudio_server_version when looking up AMIs, not both'
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -100,10 +100,10 @@ class OpenStudioAmis
|
|
100
100
|
if OpenStudioAmis.method_defined?(command)
|
101
101
|
amis = send(command)
|
102
102
|
else
|
103
|
-
|
103
|
+
raise "Unknown api version command #{command}"
|
104
104
|
end
|
105
105
|
|
106
|
-
|
106
|
+
raise "Could not find any amis for #{@version}" if amis.nil?
|
107
107
|
|
108
108
|
amis
|
109
109
|
end
|
@@ -141,8 +141,10 @@ class OpenStudioAmis
|
|
141
141
|
value = json[:openstudio_server][stable.to_sym]
|
142
142
|
amis = value[:amis]
|
143
143
|
else
|
144
|
-
|
145
|
-
|
144
|
+
unless stable
|
145
|
+
logger.info "Could not find a stable version for OpenStudio version #{@options[:openstudio_version]}. "\
|
146
|
+
'Looking up older versions to find the latest stable.'
|
147
|
+
end
|
146
148
|
|
147
149
|
json[:openstudio].each do |os_version, values|
|
148
150
|
next if os_version == :default
|
@@ -160,12 +162,13 @@ class OpenStudioAmis
|
|
160
162
|
end
|
161
163
|
end
|
162
164
|
|
163
|
-
|
165
|
+
raise "Could not find a stable version for openstudio version #{@options[:openstudio_version]}" unless amis
|
164
166
|
end
|
165
167
|
else
|
166
168
|
# return the default version (which is the latest)
|
167
169
|
default = json[:openstudio][@options[:openstudio_version].to_sym][:default]
|
168
|
-
|
170
|
+
raise "Could not find a default version for openstudio version #{@options[:openstudio_version]}" unless default
|
171
|
+
|
169
172
|
value = json[:openstudio][@options[:openstudio_version].to_sym][default.to_sym]
|
170
173
|
amis = value[:amis]
|
171
174
|
end
|
@@ -189,14 +192,16 @@ class OpenStudioAmis
|
|
189
192
|
elsif @options[:openstudio_server_version] != 'default'
|
190
193
|
hash_array = json[:builds]
|
191
194
|
hash = hash_array.select { |hash| hash[:name] == @options[:openstudio_server_version] }
|
192
|
-
|
195
|
+
raise "Multiple | no entries found matching name key `#{@options[:openstudio_server_version]}`" unless hash.length == 1
|
196
|
+
|
193
197
|
amis = {}
|
194
198
|
amis[:server] = hash.first[:ami]
|
195
199
|
amis[:worker] = hash.first[:ami]
|
196
200
|
elsif @options[:openstudio_version] != 'default'
|
197
|
-
|
201
|
+
raise 'Currently the openstudio_version lookup is not supported in v3.'
|
198
202
|
end
|
199
|
-
|
203
|
+
raise 'The requested AMI key is NULL.' if amis[:server].nil?
|
204
|
+
|
200
205
|
logger.info "AMI IDs are #{amis}" if amis
|
201
206
|
|
202
207
|
amis
|
@@ -207,7 +212,7 @@ class OpenStudioAmis
|
|
207
212
|
# fetch the URL with redirects
|
208
213
|
def fetch(uri_str, limit = 10)
|
209
214
|
# You should choose better exception.
|
210
|
-
|
215
|
+
raise ArgumentError, 'HTTP redirect too deep' if limit == 0
|
211
216
|
|
212
217
|
url = URI.parse(uri_str)
|
213
218
|
req = Net::HTTP::Get.new(url.path)
|
@@ -229,7 +234,7 @@ class OpenStudioAmis
|
|
229
234
|
if resp.code == '200'
|
230
235
|
result = JSON.parse(resp.body, symbolize_names: true)
|
231
236
|
else
|
232
|
-
|
237
|
+
raise "#{resp.code} Unable to download AMI IDs"
|
233
238
|
end
|
234
239
|
|
235
240
|
result
|