openstudio-aws 0.5.0.rc8 → 0.5.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: 0a141ce8d56b1e2d45276a4f1a8829d2c25affea
4
- data.tar.gz: 9bc56fd172f5af82eaa08d06fdccb834313b2471
3
+ metadata.gz: 13f49425895636ecaf4f257d16b89e4efa28804a
4
+ data.tar.gz: d7e29b456413dd3bb09b6c2608fcf8eea998a025
5
5
  SHA512:
6
- metadata.gz: 192d50ba829700d1aa038a81d8d7f7b06996a18d44b4e75f753f9056c291efb4f1785a64f93683e9c8061ded1f23363ec6ec167feb2a40bf22210b604652adba
7
- data.tar.gz: 70d3f029c8765796434dfb0ed5808a7e65240d5050c8a5a5b178d051e2108f980256963a4b63615c4ab8457bca357376e6d4e92369580772dcf9d9c18d3b5dac
6
+ metadata.gz: 38fc83e9eb648bedd0abf099f1c6ca78e0b708424b4f1f3d033b08b70b0a9000590bda356ca56f73b649b26105a8beeb4eac07f0eb7f33bae324f266ade3b0a9
7
+ data.tar.gz: b5937079c74a4057e6b76b70255a0d0cea29aa2e92d9685c01d2f98c8361a3c1bc7db861640ad0fba10f24b0bcfe3ef0837c53c1e68946754674b3ba5966795a
@@ -180,13 +180,18 @@ 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
+
183
185
  server_options = {
184
186
  user_id: options[:user_id],
185
187
  tags: options[:tags],
186
188
  subnet_id: options[:subnet_id],
187
- associate_public_ip_address: options[:associate_public_ip_address]
189
+ associate_public_ip_address: options[:associate_public_ip_address],
190
+ user_data_file: user_data_file
188
191
  }
189
192
 
193
+ server_options[:availability_zone] = options[:availability_zone] if options[:availability_zone]
194
+
190
195
  # save the worker pem and public to the directory
191
196
  # presently, this will always overwrite the worker key, is that okay? Is this really needed later?
192
197
  @os_aws.save_worker_keys @save_directory
@@ -228,13 +233,15 @@ module OpenStudio
228
233
  end
229
234
 
230
235
  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'
231
237
 
232
238
  unless number_of_instances == 0
233
239
  worker_options = {
234
240
  user_id: options[:user_id],
235
241
  tags: options[:tags],
236
242
  subnet_id: options[:subnet_id],
237
- associate_public_ip_address: options[:associate_public_ip_address]
243
+ associate_public_ip_address: options[:associate_public_ip_address],
244
+ user_data_file: user_data_file
238
245
  }
239
246
 
240
247
  # if options[:ebs_volume_size]
@@ -1,5 +1,5 @@
1
1
  module OpenStudio
2
2
  module Aws
3
- VERSION = '0.5.0.rc8'
3
+ VERSION = '0.5.0'
4
4
  end
5
5
  end
@@ -283,6 +283,10 @@ 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,
286
290
  'hs1.8xlarge' => 16
287
291
  }
288
292
 
@@ -383,12 +383,14 @@ class OpenStudioAwsWrapper
383
383
  defaults = {
384
384
  user_id: 'unknown_user',
385
385
  tags: [],
386
- ebs_volume_size: nil
386
+ ebs_volume_size: nil,
387
+ user_data_file: 'server_script.sh.template'
387
388
  }
388
389
  launch_options = defaults.merge(launch_options)
389
390
 
390
391
  # replace the server_script.sh.template with the keys to add
391
- user_data = File.read(File.expand_path(File.dirname(__FILE__)) + '/server_script.sh.template')
392
+
393
+ user_data = File.read(File.join(File.expand_path(File.dirname(__FILE__)), launch_options[:user_data_file]))
392
394
  user_data.gsub!(/SERVER_HOSTNAME/, 'openstudio.server')
393
395
  user_data.gsub!(/WORKER_PRIVATE_KEY_TEMPLATE/, worker_keys.private_key.gsub("\n", '\\n'))
394
396
  user_data.gsub!(/WORKER_PUBLIC_KEY_TEMPLATE/, worker_keys.ssh_public_key)
@@ -408,11 +410,12 @@ class OpenStudioAwsWrapper
408
410
  user_id: 'unknown_user',
409
411
  tags: [],
410
412
  ebs_volume_size: nil,
411
- availability_zone: @server.data.availability_zone
413
+ availability_zone: @server.data.availability_zone,
414
+ user_data_file: 'worker_script.sh.template'
412
415
  }
413
416
  launch_options = defaults.merge(launch_options)
414
417
 
415
- user_data = File.read(File.expand_path(File.dirname(__FILE__)) + '/worker_script.sh.template')
418
+ user_data = File.read(File.join(File.expand_path(File.dirname(__FILE__)), launch_options[:user_data_file]))
416
419
  user_data.gsub!(/SERVER_IP/, @server.data.private_ip_address)
417
420
  user_data.gsub!(/SERVER_HOSTNAME/, 'openstudio.server')
418
421
  user_data.gsub!(/WORKER_PUBLIC_KEY_TEMPLATE/, worker_keys.ssh_public_key)
@@ -474,25 +477,46 @@ class OpenStudioAwsWrapper
474
477
 
475
478
  # blocking method that executes required commands for creating and provisioning a docker swarm cluster
476
479
  def configure_swarm_cluster(save_directory)
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"')
477
482
  logger.info('Running the configuration script for the server.')
478
- @server.wait_command('sudo /home/ubuntu/server_provision.sh && echo "true"')
483
+ @server.wait_command('echo $(env) &> /home/ubuntu/env.log && echo "true"')
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"')
479
486
  logger.info('Downloading the swarm join command.')
480
487
  swarm_file = File.join(save_directory, 'worker_swarm_join.sh')
481
488
  @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"') }
482
491
  logger.info('Running the configuration script for the worker(s).')
483
- @workers.each { |worker| worker.wait_command('sudo /home/ubuntu/worker_provision.sh && echo "true"') }
492
+ @workers.each { |worker| worker.wait_command('sudo /home/ubuntu/worker_provision.sh &> /home/ubuntu/worker_provision.log && echo "true"') }
484
493
  logger.info('Successfully re-sized storage devices for all nodes. Joining server nodes to the swarm.')
485
494
  worker_join_cmd = "#{File.read(swarm_file).strip} && echo \"true\""
486
495
  @workers.each { |worker| worker.wait_command(worker_join_cmd) }
487
496
  logger.info('All worker nodes have been added to the swarm. Setting environment variables and starting the cluster')
488
497
  total_procs = @server.procs
489
498
  @workers.each { |worker| total_procs += worker.procs }
490
- @server.shell_command("OS_SERVER_NUMBER_OF_WORKERS=#{total_procs} docker stack deploy --compose-file docker-compose.yml osserver-stack")
499
+ max_requests = ((total_procs + 10) * 1.2).round
500
+ mongo_cores = (total_procs / 64.0).ceil
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\"")
491
513
  sleep 10
492
514
  logger.info('The OpenStudio Server stack has been started. Waiting for the server to become available.')
493
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\"")
494
516
  logger.info('The OpenStudio Server stack has become available. Scaling the worker nodes.')
495
- @server.wait_command("docker service scale osserver-stack_worker=#{total_procs} && echo \"true\"")
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\"")
496
520
  logger.info('The OpenStudio Server stack is booted and ready for analysis submissions.')
497
521
  end
498
522
 
@@ -0,0 +1,48 @@
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
@@ -0,0 +1,39 @@
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
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.5.0.rc8
4
+ version: 0.5.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: 2017-03-21 00:00:00.000000000 Z
11
+ date: 2017-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-scp
@@ -123,7 +123,9 @@ 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
126
127
  - lib/openstudio/lib/server_script.sh.template
128
+ - lib/openstudio/lib/worker_script.sh.docker.template
127
129
  - lib/openstudio/lib/worker_script.sh.template
128
130
  - openstudio-aws.gemspec
129
131
  - spec/aws_instances/aws_spec_api.rb