openstudio-aws 0.5.0.pre.rc10 → 0.5.0.rc0
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 +4 -4
- data/lib/openstudio/aws/aws.rb +6 -20
- data/lib/openstudio/aws/version.rb +1 -1
- data/lib/openstudio/lib/ami_list.rb +6 -10
- data/lib/openstudio/lib/openstudio_aws_instance.rb +1 -5
- data/lib/openstudio/lib/openstudio_aws_wrapper.rb +18 -44
- data/spec/openstudio-aws/ami_list_spec.rb +59 -3
- data/spec/openstudio-aws/aws_spec.rb +15 -4
- data/spec/openstudio-aws/aws_wrapper_spec.rb +3 -3
- metadata +17 -19
- data/lib/openstudio/lib/server_script.sh.docker.template +0 -48
- data/lib/openstudio/lib/worker_script.sh.docker.template +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f25ae1f2fffef1ff271532785c98876ca3537a49
|
4
|
+
data.tar.gz: 33d4ffb87da5ec343c439792f2c92313860ee44c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5372a36a082bf5a83462debb6773cfaa3d2acba5a53e22125278a8b7144141f90b3bc977386c437761435743489d62dd2eead6a603e33c613674606579735449
|
7
|
+
data.tar.gz: f1f2769a3ef6d21d5722a543a572e73088ae8638c205fb1574fed894bf862ba1635365aa277176daa88708c87f5563eba7691a395d9ad92773d09ad3831d0ec8
|
data/lib/openstudio/aws/aws.rb
CHANGED
@@ -162,8 +162,8 @@ module OpenStudio
|
|
162
162
|
end
|
163
163
|
|
164
164
|
if options[:security_groups].empty?
|
165
|
-
# if the user has not specified any security groups, then create one called: 'openstudio-server-sg-
|
166
|
-
@os_aws.create_or_retrieve_default_security_group(tmp_name = 'openstudio-server-sg-v2.
|
165
|
+
# if the user has not specified any security groups, then create one called: 'openstudio-server-sg-v1'
|
166
|
+
@os_aws.create_or_retrieve_default_security_group(tmp_name = 'openstudio-server-sg-v2.1',
|
167
167
|
vpc_id=options[:vpc_id])
|
168
168
|
else
|
169
169
|
@os_aws.security_groups = options[:security_groups]
|
@@ -180,18 +180,13 @@ module OpenStudio
|
|
180
180
|
@os_aws.save_private_key @save_directory
|
181
181
|
end
|
182
182
|
|
183
|
-
user_data_file = @dockerized ? 'server_script.sh.docker.template' : 'server_script.sh.template'
|
184
|
-
|
185
183
|
server_options = {
|
186
184
|
user_id: options[:user_id],
|
187
185
|
tags: options[:tags],
|
188
186
|
subnet_id: options[:subnet_id],
|
189
|
-
associate_public_ip_address: options[:associate_public_ip_address]
|
190
|
-
user_data_file: user_data_file
|
187
|
+
associate_public_ip_address: options[:associate_public_ip_address]
|
191
188
|
}
|
192
189
|
|
193
|
-
server_options[:availability_zone] = options[:availability_zone] if options[:availability_zone]
|
194
|
-
|
195
190
|
# save the worker pem and public to the directory
|
196
191
|
# presently, this will always overwrite the worker key, is that okay? Is this really needed later?
|
197
192
|
@os_aws.save_worker_keys @save_directory
|
@@ -233,15 +228,13 @@ module OpenStudio
|
|
233
228
|
end
|
234
229
|
|
235
230
|
fail "Can't create workers without a server instance running" if @os_aws.server.nil?
|
236
|
-
user_data_file = @dockerized ? 'worker_script.sh.docker.template' : 'worker_script.sh.template'
|
237
231
|
|
238
232
|
unless number_of_instances == 0
|
239
233
|
worker_options = {
|
240
234
|
user_id: options[:user_id],
|
241
235
|
tags: options[:tags],
|
242
236
|
subnet_id: options[:subnet_id],
|
243
|
-
associate_public_ip_address: options[:associate_public_ip_address]
|
244
|
-
user_data_file: user_data_file
|
237
|
+
associate_public_ip_address: options[:associate_public_ip_address]
|
245
238
|
}
|
246
239
|
|
247
240
|
# if options[:ebs_volume_size]
|
@@ -253,15 +246,8 @@ module OpenStudio
|
|
253
246
|
|
254
247
|
logger.info 'Waiting for server/worker configurations'
|
255
248
|
|
256
|
-
|
257
|
-
|
258
|
-
@os_aws.configure_swarm_cluster(@save_directory)
|
259
|
-
else
|
260
|
-
@os_aws.configure_server_and_workers
|
261
|
-
end
|
262
|
-
rescue => e
|
263
|
-
fail "Configuring the cluster failed with error `#{e.message}` in:\n#{e.backtrace.join('\n')}"
|
264
|
-
end
|
249
|
+
return @os_aws.configure_server_and_workers unless @dockerized
|
250
|
+
@os_aws.configure_swarm_cluster if @dockerized
|
265
251
|
end
|
266
252
|
|
267
253
|
# Write out to the terminal the connection information for the servers and workers
|
@@ -179,24 +179,20 @@ class OpenStudioAmis
|
|
179
179
|
# Return the required docker AMI base box
|
180
180
|
def get_ami_version_3
|
181
181
|
json = list
|
182
|
-
amis =
|
182
|
+
amis = {}
|
183
183
|
if @options[:openstudio_version].to_sym == :default && @options[:openstudio_server_version].to_sym == :default
|
184
184
|
# grab the most recent openstudio server version - this is not recommended
|
185
|
-
value = json[:
|
186
|
-
amis = {}
|
185
|
+
key, value = json[:openstudio_server].first
|
187
186
|
amis[:server] = value[:ami]
|
188
187
|
amis[:worker] = value[:ami]
|
189
188
|
elsif @options[:openstudio_server_version] != 'default'
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
amis = {}
|
194
|
-
amis[:server] = hash.first[:ami]
|
195
|
-
amis[:worker] = hash.first[:ami]
|
189
|
+
value = json[:openstudio_server][@options[:openstudio_server_version].to_sym]
|
190
|
+
amis[:server] = value[:ami]
|
191
|
+
amis[:worker] = value[:ami]
|
196
192
|
elsif @options[:openstudio_version] != 'default'
|
197
193
|
fail 'Currently the openstudio_version lookup is not supported in v3.'
|
198
194
|
end
|
199
|
-
|
195
|
+
|
200
196
|
logger.info "AMI IDs are #{amis}" if amis
|
201
197
|
|
202
198
|
amis
|
@@ -170,7 +170,7 @@ class OpenStudioAwsInstance
|
|
170
170
|
|
171
171
|
# only asked for 1 instance, so therefore it should be the first
|
172
172
|
begin
|
173
|
-
tries ||=
|
173
|
+
tries ||= 3
|
174
174
|
aws_instance = result.data.instances.first
|
175
175
|
@aws.create_tags(
|
176
176
|
resources: [aws_instance.instance_id],
|
@@ -283,10 +283,6 @@ class OpenStudioAwsInstance
|
|
283
283
|
'i2.2xlarge' => 8,
|
284
284
|
'i2.4xlarge' => 16,
|
285
285
|
'i2.8xlarge' => 32,
|
286
|
-
'd2.xlarge' => 4,
|
287
|
-
'd2.2xlarge' => 8,
|
288
|
-
'd2.4xlarge' => 16,
|
289
|
-
'd2.8xlarge' => 36,
|
290
286
|
'hs1.8xlarge' => 16
|
291
287
|
}
|
292
288
|
|
@@ -59,7 +59,7 @@ class OpenStudioAwsWrapper
|
|
59
59
|
@region = options[:region] || 'unknown-region'
|
60
60
|
|
61
61
|
# If the keys exist in the directory then load those, otherwise create new ones.
|
62
|
-
@work_dir =
|
62
|
+
@work_dir = options[:save_directory] || '.'
|
63
63
|
if File.exist?(File.join(@work_dir, 'ec2_worker_key.pem')) && File.exist?(File.join(@work_dir, 'ec2_worker_key.pub'))
|
64
64
|
logger.info "Worker keys already exist, loading from #{@work_dir}"
|
65
65
|
load_worker_key(File.join(@work_dir, 'ec2_worker_key.pem'))
|
@@ -81,7 +81,7 @@ class OpenStudioAwsWrapper
|
|
81
81
|
@aws = Aws::EC2::Client.new(options[:credentials])
|
82
82
|
end
|
83
83
|
|
84
|
-
def create_or_retrieve_default_security_group(tmp_name = 'openstudio-server-sg-v2.
|
84
|
+
def create_or_retrieve_default_security_group(tmp_name = 'openstudio-server-sg-v2.1', vpc_id = nil)
|
85
85
|
group = @aws.describe_security_groups(filters: [{ name: 'group-name', values: [tmp_name] }])
|
86
86
|
logger.info "Length of the security group is: #{group.data.security_groups.length}"
|
87
87
|
if group.data.security_groups.length == 0
|
@@ -94,13 +94,13 @@ class OpenStudioAwsWrapper
|
|
94
94
|
end
|
95
95
|
group_id = r[:group_id]
|
96
96
|
@aws.authorize_security_group_ingress(
|
97
|
+
group_name: tmp_name,
|
97
98
|
group_id: group_id,
|
98
99
|
ip_permissions: [
|
99
100
|
{ ip_protocol: 'tcp', from_port: 22, to_port: 22, ip_ranges: [cidr_ip: '0.0.0.0/0'] }, # Eventually make this only the user's IP address seen by the internet
|
100
101
|
{ ip_protocol: 'tcp', from_port: 80, to_port: 80, ip_ranges: [cidr_ip: '0.0.0.0/0'] },
|
101
102
|
{ ip_protocol: 'tcp', from_port: 443, to_port: 443, ip_ranges: [cidr_ip: '0.0.0.0/0'] },
|
102
103
|
{ ip_protocol: 'tcp', from_port: 0, to_port: 65535, user_id_group_pairs: [{ group_name: tmp_name }] }, # allow all machines in the security group talk to each other openly
|
103
|
-
{ ip_protocol: 'udp', from_port: 0, to_port: 65535, user_id_group_pairs: [{ group_name: tmp_name }] }, # allow all machines in the security group talk to each other openly
|
104
104
|
{ ip_protocol: 'icmp', from_port: -1, to_port: -1, ip_ranges: [cidr_ip: '0.0.0.0/0'] }
|
105
105
|
]
|
106
106
|
)
|
@@ -383,14 +383,12 @@ class OpenStudioAwsWrapper
|
|
383
383
|
defaults = {
|
384
384
|
user_id: 'unknown_user',
|
385
385
|
tags: [],
|
386
|
-
ebs_volume_size: nil
|
387
|
-
user_data_file: 'server_script.sh.template'
|
386
|
+
ebs_volume_size: nil
|
388
387
|
}
|
389
388
|
launch_options = defaults.merge(launch_options)
|
390
389
|
|
391
390
|
# replace the server_script.sh.template with the keys to add
|
392
|
-
|
393
|
-
user_data = File.read(File.join(File.expand_path(File.dirname(__FILE__)), launch_options[:user_data_file]))
|
391
|
+
user_data = File.read(File.expand_path(File.dirname(__FILE__)) + '/server_script.sh.template')
|
394
392
|
user_data.gsub!(/SERVER_HOSTNAME/, 'openstudio.server')
|
395
393
|
user_data.gsub!(/WORKER_PRIVATE_KEY_TEMPLATE/, worker_keys.private_key.gsub("\n", '\\n'))
|
396
394
|
user_data.gsub!(/WORKER_PUBLIC_KEY_TEMPLATE/, worker_keys.ssh_public_key)
|
@@ -410,12 +408,11 @@ class OpenStudioAwsWrapper
|
|
410
408
|
user_id: 'unknown_user',
|
411
409
|
tags: [],
|
412
410
|
ebs_volume_size: nil,
|
413
|
-
availability_zone: @server.data.availability_zone
|
414
|
-
user_data_file: 'worker_script.sh.template'
|
411
|
+
availability_zone: @server.data.availability_zone
|
415
412
|
}
|
416
413
|
launch_options = defaults.merge(launch_options)
|
417
414
|
|
418
|
-
user_data = File.read(File.
|
415
|
+
user_data = File.read(File.expand_path(File.dirname(__FILE__)) + '/worker_script.sh.template')
|
419
416
|
user_data.gsub!(/SERVER_IP/, @server.data.private_ip_address)
|
420
417
|
user_data.gsub!(/SERVER_HOSTNAME/, 'openstudio.server')
|
421
418
|
user_data.gsub!(/WORKER_PUBLIC_KEY_TEMPLATE/, worker_keys.ssh_public_key)
|
@@ -476,48 +473,25 @@ class OpenStudioAwsWrapper
|
|
476
473
|
end
|
477
474
|
|
478
475
|
# blocking method that executes required commands for creating and provisioning a docker swarm cluster
|
479
|
-
def configure_swarm_cluster
|
480
|
-
logger.info('waiting for server user_data to complete')
|
481
|
-
@server.wait_command('while ! [ -e /home/ubuntu/user_data_done ]; do sleep 5; done && echo "true"')
|
476
|
+
def configure_swarm_cluster
|
482
477
|
logger.info('Running the configuration script for the server.')
|
483
|
-
@server.wait_command('
|
484
|
-
@server.wait_command('cp /home/ubuntu/server_provision.sh /home/ubuntu/server_provision.sh.bak && echo "true"')
|
485
|
-
@server.wait_command('sudo /home/ubuntu/server_provision.sh &> /home/ubuntu/server_provision.log && echo "true"')
|
478
|
+
@server.wait_command('sudo /home/ubuntu/server_provision.sh && echo "true"')
|
486
479
|
logger.info('Downloading the swarm join command.')
|
487
|
-
swarm_file = File.join(
|
480
|
+
swarm_file = File.join(@work_dir, 'worker_swarm_join.sh')
|
488
481
|
@server.download_file('/home/ubuntu/swarmjoin.sh', swarm_file)
|
489
|
-
logger.info('waiting for worker user_data to complete')
|
490
|
-
@workers.each { |worker| worker.wait_command('while ! [ -e /home/ubuntu/user_data_done ]; do sleep 5; done && echo "true"') }
|
491
482
|
logger.info('Running the configuration script for the worker(s).')
|
492
|
-
@workers.each { |worker| worker.wait_command('sudo /home/ubuntu/worker_provision.sh
|
483
|
+
@workers.each { |worker| worker.wait_command('sudo /home/ubuntu/worker_provision.sh && echo "true"') }
|
493
484
|
logger.info('Successfully re-sized storage devices for all nodes. Joining server nodes to the swarm.')
|
494
|
-
worker_join_cmd = "#{File.read(
|
485
|
+
worker_join_cmd = "#{File.read('worker_swarm_join.sh').strip} && echo \"true\""
|
495
486
|
@workers.each { |worker| worker.wait_command(worker_join_cmd) }
|
496
|
-
logger.info('All worker nodes have been added to the swarm.
|
487
|
+
logger.info('All worker nodes have been added to the swarm. Starting the server cluster.')
|
488
|
+
@server.shell_command('docker stack deploy --compose-file docker-compose.yml osserver-stack')
|
489
|
+
sleep 10
|
490
|
+
logger.info('The OpenStudio Server stack has been started. Scaling worker nodes.')
|
497
491
|
total_procs = @server.procs
|
498
492
|
@workers.each { |worker| total_procs += worker.procs }
|
499
|
-
|
500
|
-
|
501
|
-
web_cores = (total_procs / 32.0).ceil
|
502
|
-
max_pool = 16 * web_cores
|
503
|
-
rez_mem = 512 * max_pool
|
504
|
-
total_procs = total_procs - mongo_cores - web_cores + 2
|
505
|
-
@server.shell_command("echo 'MAX_REQUESTS=#{max_requests}' >> /home/ubuntu/.env && echo \"true\"")
|
506
|
-
@server.shell_command("echo 'MONGO_CORES=#{mongo_cores}' >> /home/ubuntu/.env && echo \"true\"")
|
507
|
-
@server.shell_command("echo 'WEB_CORES=#{web_cores}' >> /home/ubuntu/.env && echo \"true\"")
|
508
|
-
@server.shell_command("echo 'MAX_POOL=#{max_pool}' >> /home/ubuntu/.env && echo \"true\"")
|
509
|
-
@server.shell_command("echo 'REZ_MEM=#{rez_mem}M' >> /home/ubuntu/.env && echo \"true\"")
|
510
|
-
@server.shell_command("echo 'OS_SERVER_NUMBER_OF_WORKERS=#{total_procs}' >> /home/ubuntu/.env && echo \"true\"")
|
511
|
-
@server.shell_command("echo '' >> /home/ubuntu/.env && echo \"true\"")
|
512
|
-
@server.shell_command("docker stack deploy --compose-file docker-compose.yml osserver && echo \"true\"")
|
513
|
-
sleep 10
|
514
|
-
logger.info('The OpenStudio Server stack has been started. Waiting for the server to become available.')
|
515
|
-
@server.wait_command("while ( nc -zv #{@server.ip} 80 3>&1 1>&2- 2>&3- ) | awk -F \":\" '$3 != \" Connection refused\" {exit 1}'; do sleep 5; done && echo \"true\"")
|
516
|
-
logger.info('The OpenStudio Server stack has become available. Scaling the worker nodes.')
|
517
|
-
@server.wait_command("docker service scale osserver_worker=#{total_procs} && echo \"true\"")
|
518
|
-
logger.info('Waiting up to two minutes for the osserver_worker service to scale.')
|
519
|
-
@server.wait_command("timeout 120 bash -c -- 'while [ $( docker service ls -f name=osserver_worker --format=\"{{.Replicas}}\" ) != \"#{total_procs}/#{total_procs}\" ]; do sleep 5; done'; echo \"true\"")
|
520
|
-
logger.info('The OpenStudio Server stack is booted and ready for analysis submissions.')
|
493
|
+
@server.wait_command("docker service scale osserver-stack_worker=#{total_procs} && echo \"true\"")
|
494
|
+
logger.info('The OpenStudio Server stack has been configured.')
|
521
495
|
end
|
522
496
|
|
523
497
|
# method to query the amazon api to find the server (if it exists), based on the group id
|
@@ -14,11 +14,12 @@ describe OpenStudioAmis do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'should return specific amis if passed a version' do
|
17
|
-
a = OpenStudioAmis.new(1, openstudio_version: '1.
|
17
|
+
a = OpenStudioAmis.new(1, openstudio_version: '1.2.1')
|
18
18
|
amis = a.get_amis
|
19
19
|
|
20
|
-
expect(amis[:server]).to eq('ami-
|
21
|
-
expect(amis[:worker]).to eq('ami-
|
20
|
+
expect(amis[:server]).to eq('ami-89744be0')
|
21
|
+
expect(amis[:worker]).to eq('ami-37744b5e')
|
22
|
+
expect(amis[:cc2worker]).to eq('ami-51744b38')
|
22
23
|
end
|
23
24
|
|
24
25
|
it 'should list all amis' do
|
@@ -29,11 +30,66 @@ describe OpenStudioAmis do
|
|
29
30
|
end
|
30
31
|
|
31
32
|
context 'version 2' do
|
33
|
+
it 'should return openstudio server version 1.8.0 correctly' do
|
34
|
+
a = OpenStudioAmis.new(2, openstudio_server_version: '1.8.0')
|
35
|
+
|
36
|
+
amis = a.get_amis
|
37
|
+
|
38
|
+
expect(amis[:server]).to eq('ami-3c0fbf54')
|
39
|
+
expect(amis[:worker]).to eq('ami-040ebe6c')
|
40
|
+
expect(amis[:cc2worker]).to eq('ami-040ebe6c')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'version 2' do
|
45
|
+
it 'should return openstudio version 1.7.1 when stable is passed to 1.7.5' do
|
46
|
+
a = OpenStudioAmis.new(2, openstudio_version: '1.7.5', stable: true)
|
47
|
+
|
48
|
+
amis = a.get_amis
|
49
|
+
|
50
|
+
expect(amis[:server]).to eq('ami-845a54ec')
|
51
|
+
expect(amis[:worker]).to eq('ami-3a5a5452')
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should return openstudio version 1.7.1 stable & default versions correctly' do
|
55
|
+
a = OpenStudioAmis.new(2, openstudio_version: '1.7.1')
|
56
|
+
|
57
|
+
amis = a.get_amis
|
58
|
+
|
59
|
+
expect(amis[:server]).to eq('ami-845a54ec')
|
60
|
+
expect(amis[:worker]).to eq('ami-3a5a5452')
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should return openstudio version 1.7.0 default version correctly' do
|
64
|
+
a = OpenStudioAmis.new(2, openstudio_version: '1.7.0')
|
65
|
+
|
66
|
+
amis = a.get_amis
|
67
|
+
|
68
|
+
expect(amis[:server]).to eq('ami-725b701a')
|
69
|
+
expect(amis[:worker]).to eq('ami-4a446f22')
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should return openstudio version 1.7.0 stable version correctly' do
|
73
|
+
a = OpenStudioAmis.new(2, openstudio_version: '1.7.0', stable: true)
|
74
|
+
|
75
|
+
amis = a.get_amis
|
76
|
+
|
77
|
+
expect(amis[:server]).to eq('ami-c06b40a8')
|
78
|
+
expect(amis[:worker]).to eq('ami-9a97bff2')
|
79
|
+
end
|
32
80
|
|
33
81
|
it 'should fail when trying to find a stable version for older releases' do
|
34
82
|
a = OpenStudioAmis.new(2, openstudio_version: '1.5.0', stable: true)
|
35
83
|
|
36
84
|
expect { a.get_amis }.to raise_error(/Could not find a stable version for openstudio version 1.5.0/)
|
37
85
|
end
|
86
|
+
|
87
|
+
it 'should return latest version when passing in a future version' do
|
88
|
+
a = OpenStudioAmis.new(2, openstudio_version: '4.8.15', stable: true)
|
89
|
+
|
90
|
+
a = a.get_amis
|
91
|
+
|
92
|
+
expect(a).not_to be nil
|
93
|
+
end
|
38
94
|
end
|
39
95
|
end
|
@@ -25,6 +25,17 @@ describe OpenStudio::Aws::Aws do
|
|
25
25
|
|
26
26
|
expect(aws.default_amis).not_to be_nil
|
27
27
|
end
|
28
|
+
|
29
|
+
it 'should find the cc2 instances' do
|
30
|
+
options = {
|
31
|
+
ami_lookup_version: 2,
|
32
|
+
openstudio_server_version: '1.5.0'
|
33
|
+
}
|
34
|
+
aws = OpenStudio::Aws::Aws.new(options)
|
35
|
+
|
36
|
+
expect(aws.determine_image_type('cc2.2xlarge')).to eq 'ami-e582948c'
|
37
|
+
expect(aws.determine_image_type('c3.2xlarge')).to eq 'ami-918294f8'
|
38
|
+
end
|
28
39
|
end
|
29
40
|
|
30
41
|
context 'should error' do
|
@@ -38,14 +49,14 @@ describe OpenStudio::Aws::Aws do
|
|
38
49
|
end
|
39
50
|
|
40
51
|
context 'version testing' do
|
41
|
-
it 'version 2: should find the right AMIs Server 1.
|
52
|
+
it 'version 2: should find the right AMIs Server 1.3.1' do
|
42
53
|
options = {
|
43
54
|
ami_lookup_version: 2,
|
44
|
-
openstudio_server_version: '1.
|
55
|
+
openstudio_server_version: '1.3.1'
|
45
56
|
}
|
46
57
|
aws = OpenStudio::Aws::Aws.new(options)
|
47
|
-
expect(aws.default_amis[:worker]).to eq('ami-
|
48
|
-
expect(aws.default_amis[:server]).to eq('ami-
|
58
|
+
expect(aws.default_amis[:worker]).to eq('ami-39bb8750')
|
59
|
+
expect(aws.default_amis[:server]).to eq('ami-a9bb87c0')
|
49
60
|
end
|
50
61
|
end
|
51
62
|
|
@@ -73,9 +73,9 @@ describe OpenStudioAwsWrapper do
|
|
73
73
|
context 'version 2' do
|
74
74
|
it 'should create a new json' do
|
75
75
|
resp = @aws.os_aws.create_new_ami_json(2)
|
76
|
-
expect(resp[:openstudio_server]['1.
|
77
|
-
expect(resp[:openstudio_server]['1.
|
78
|
-
expect(resp[:openstudio_server]['1.
|
76
|
+
expect(resp[:openstudio_server]['1.8.0'.to_sym][:amis][:server]).to eq('ami-3c0fbf54')
|
77
|
+
expect(resp[:openstudio_server]['1.3.1'.to_sym][:openstudio_version_sha]).to eq('7a955d780b')
|
78
|
+
expect(resp[:openstudio_server]['1.3.5'.to_sym][:tested]).to eq(false)
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openstudio-aws
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.0.
|
4
|
+
version: 0.5.0.rc0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas Long
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-scp
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -56,42 +56,42 @@ dependencies:
|
|
56
56
|
name: semantic
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.4'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.4'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sshkey
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '1.7'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.7'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rake
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '10.4'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '10.4'
|
97
97
|
description: Custom classes for configuring clusters for OpenStudio & EnergyPlus analyses
|
@@ -101,10 +101,10 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
-
-
|
105
|
-
-
|
106
|
-
-
|
107
|
-
-
|
104
|
+
- .gitignore
|
105
|
+
- .gitmodules
|
106
|
+
- .rubocop.yml
|
107
|
+
- .travis.yml
|
108
108
|
- CHANGELOG.md
|
109
109
|
- Gemfile
|
110
110
|
- License.txt
|
@@ -123,9 +123,7 @@ files:
|
|
123
123
|
- lib/openstudio/lib/openstudio_aws_logger.rb
|
124
124
|
- lib/openstudio/lib/openstudio_aws_wrapper.rb
|
125
125
|
- lib/openstudio/lib/openstudio_cloud_watch.rb
|
126
|
-
- lib/openstudio/lib/server_script.sh.docker.template
|
127
126
|
- lib/openstudio/lib/server_script.sh.template
|
128
|
-
- lib/openstudio/lib/worker_script.sh.docker.template
|
129
127
|
- lib/openstudio/lib/worker_script.sh.template
|
130
128
|
- openstudio-aws.gemspec
|
131
129
|
- spec/aws_instances/aws_spec_api.rb
|
@@ -146,17 +144,17 @@ require_paths:
|
|
146
144
|
- lib
|
147
145
|
required_ruby_version: !ruby/object:Gem::Requirement
|
148
146
|
requirements:
|
149
|
-
- -
|
147
|
+
- - '>='
|
150
148
|
- !ruby/object:Gem::Version
|
151
149
|
version: 2.0.0
|
152
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
151
|
requirements:
|
154
|
-
- -
|
152
|
+
- - '>='
|
155
153
|
- !ruby/object:Gem::Version
|
156
154
|
version: 1.3.6
|
157
155
|
requirements: []
|
158
156
|
rubyforge_project:
|
159
|
-
rubygems_version: 2.6.
|
157
|
+
rubygems_version: 2.6.7
|
160
158
|
signing_key:
|
161
159
|
specification_version: 4
|
162
160
|
summary: Start AWS EC2 instances for running distributed OpenStudio-based analyses
|
@@ -1,48 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
# AWS Server Bootstrap File
|
4
|
-
# This script is used to configure the AWS boxes for OpenStudio-server
|
5
|
-
|
6
|
-
ENTRY="127.0.0.1 SERVER_HOSTNAME"
|
7
|
-
FILE=/etc/hosts
|
8
|
-
if grep -q "$ENTRY" $FILE; then
|
9
|
-
echo "Hosts '$SERVER_HOSTNAME' entry already exists"
|
10
|
-
else
|
11
|
-
sudo sh -c "echo $ENTRY >> /etc/hosts"
|
12
|
-
fi
|
13
|
-
|
14
|
-
WORKER_PRIVATE_KEY="WORKER_PRIVATE_KEY_TEMPLATE"
|
15
|
-
WORKER_PUBLIC_KEY="WORKER_PUBLIC_KEY_TEMPLATE"
|
16
|
-
|
17
|
-
USER=ubuntu
|
18
|
-
|
19
|
-
mkdir -p /home/$USER/.ssh && chmod 700 /home/$USER/.ssh
|
20
|
-
echo -e $WORKER_PRIVATE_KEY > /home/$USER/.ssh/id_rsa
|
21
|
-
echo -e $WORKER_PUBLIC_KEY > /home/$USER/.ssh/id_rsa.pub
|
22
|
-
chmod 600 /home/$USER/.ssh/id_rsa
|
23
|
-
chmod 644 /home/$USER/.ssh/id_rsa.pub
|
24
|
-
chown ubuntu.ubuntu /home/$USER/.ssh/id_rsa
|
25
|
-
chown ubuntu.ubuntu /home/$USER/.ssh/id_rsa.pub
|
26
|
-
|
27
|
-
# Only allow localhost (and localhosts IP) to connect ot itself with this key. The IP is used for R cluster
|
28
|
-
ENTRY="from=\"localhost,127.0.0.1\" $WORKER_PUBLIC_KEY"
|
29
|
-
FILE=/home/$USER/.ssh/authorized_keys
|
30
|
-
if grep -q "$ENTRY" $FILE; then
|
31
|
-
echo "Key already exists in file"
|
32
|
-
else
|
33
|
-
echo $ENTRY >> $FILE
|
34
|
-
fi
|
35
|
-
chmod 644 /home/$USER/.ssh/authorized_keys
|
36
|
-
|
37
|
-
# SSH config
|
38
|
-
echo -e "Host *\n\tStrictHostKeyChecking no" > /home/$USER/.ssh/config
|
39
|
-
chmod 644 /home/$USER/.ssh/config && chown ubuntu.ubuntu /home/$USER/.ssh/config
|
40
|
-
|
41
|
-
# ec2 instance information
|
42
|
-
curl -o /usr/local/bin/ec2-metadata http://s3.amazonaws.com/ec2metadata/ec2-metadata
|
43
|
-
chmod 775 /usr/local/bin/ec2-metadata
|
44
|
-
mkdir -p /etc/openstudio-server
|
45
|
-
ec2-metadata -a -i -t -h -o -z -p -v > /etc/openstudio-server/instance.yml
|
46
|
-
|
47
|
-
#file flag the user_data has completed
|
48
|
-
cat /dev/null > /home/ubuntu/user_data_done
|
@@ -1,39 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
# AWS Worker Bootstrap File
|
4
|
-
# File used to configure worker nodes on AWS
|
5
|
-
|
6
|
-
# Change Host File Entries
|
7
|
-
ENTRY="SERVER_IP SERVER_HOSTNAME"
|
8
|
-
FILE=/etc/hosts
|
9
|
-
if grep -q "$ENTRY" $FILE; then
|
10
|
-
echo "entry already exists"
|
11
|
-
else
|
12
|
-
sh -c "echo $ENTRY >> $FILE"
|
13
|
-
fi
|
14
|
-
|
15
|
-
WORKER_PUBLIC_KEY="WORKER_PUBLIC_KEY_TEMPLATE"
|
16
|
-
|
17
|
-
# add the public key to authorized keys
|
18
|
-
USER=ubuntu
|
19
|
-
|
20
|
-
mkdir -p /home/$USER/.ssh && chmod 700 /home/$USER/.ssh
|
21
|
-
|
22
|
-
# Only access from the server node
|
23
|
-
ENTRY="from=\"SERVER_HOSTNAME\" $WORKER_PUBLIC_KEY"
|
24
|
-
FILE=/home/$USER/.ssh/authorized_keys
|
25
|
-
if grep -q "$ENTRY" $FILE; then
|
26
|
-
echo "Key already exists in file"
|
27
|
-
else
|
28
|
-
echo $ENTRY >> $FILE
|
29
|
-
fi
|
30
|
-
chmod 644 /home/$USER/.ssh/authorized_keys
|
31
|
-
|
32
|
-
# ec2 instance information
|
33
|
-
curl -o /usr/local/bin/ec2-metadata http://s3.amazonaws.com/ec2metadata/ec2-metadata
|
34
|
-
chmod 775 /usr/local/bin/ec2-metadata
|
35
|
-
mkdir -p /etc/openstudio-server
|
36
|
-
ec2-metadata -a -i -t -h -o -z -p -v > /etc/openstudio-server/instance.yml
|
37
|
-
|
38
|
-
#file flag the user_data has completed
|
39
|
-
cat /dev/null > /home/ubuntu/user_data_done
|