pvcglue 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  module Pvcglue
2
2
  class Pvcify
3
3
  def self.run
4
- Pvcglue::Monit.monitify
4
+ # Pvcglue::Monit.monitify
5
5
  Pvcglue::Capistrano.capify
6
6
  Pvcglue::Db.configure_database_yml
7
7
  end
@@ -40,11 +40,11 @@ module Pvcglue
40
40
  # minion.droplet = droplet
41
41
  # new_minions << minion if true || minion.provision!
42
42
  unless minion.provisioned?
43
- existing_droplet = droplets.detect { |droplet| droplet.name == minion_name }
44
- if existing_droplet
43
+ existing_machine = minion.pvc_cloud_provider.find_by_name(minion_name)
44
+ if existing_machine
45
45
  Pvcglue.logger.warn("Machine with the name of '#{minion_name}' already exists.")
46
- if Thor::Shell::Basic.new.yes?("Existing machine found. Do you want to use #{existing_droplet.id} for #{minion_name}")
47
- minion.droplet = existing_droplet
46
+ if Thor::Shell::Basic.new.yes?("Existing machine found. Do you want to use #{existing_machine.id} for #{minion_name}")
47
+ minion.machine = existing_machine
48
48
  new_minions << minion
49
49
  else
50
50
  Pvcglue.logger.error("Machine with the name of '#{minion_name}' already exists.")
@@ -60,14 +60,14 @@ module Pvcglue
60
60
 
61
61
  if new_minions.size > 0
62
62
  # ap new_minions
63
- Pvcglue.logger.info("Checking status of new minions (#{new_minions.size})...")
63
+ Pvcglue.logger.info("Checking the status of the #{new_minions.size == 1 ? 'new minion' : "#{new_minions.size} minions"}...")
64
64
  time = Benchmark.realtime do
65
65
  begin
66
- lazy_minions = get_lazy_minions(minions)
66
+ lazy_minions = get_lazy_minions(new_minions)
67
67
  unless lazy_minions.size == 0
68
68
  # puts '*'*175
69
69
  # ap waiting_for
70
- Pvcglue.logger.info("Waiting for #{lazy_minions.map { |key, value| key }.join(', ')}...")
70
+ Pvcglue.logger.info("Waiting for #{lazy_minions.map { |minion| minion.machine_name }.join(', ')}...")
71
71
  sleep(1.5)
72
72
  end
73
73
  end until lazy_minions.size == 0
@@ -77,6 +77,7 @@ module Pvcglue
77
77
  minions[updated_minion.machine_name].public_ip = updated_minion.public_ip
78
78
  minions[updated_minion.machine_name].cloud_id = updated_minion.cloud_id
79
79
  minions[updated_minion.machine_name].connection = Pvcglue::Connection.new(minions[updated_minion.machine_name])
80
+ Pvcglue::Packages::SshKeyCheck.apply(minions[updated_minion.machine_name])
80
81
  end
81
82
  end
82
83
  Pvcglue.logger.info("Minions (finally) ready after #{time.round(2)} seconds!")
@@ -101,19 +102,27 @@ module Pvcglue
101
102
  Pvcglue::Manager.pull_configuration
102
103
  data = File.read(Pvcglue.cloud.local_file_name)
103
104
  updated_minions = minions.map do |minion|
104
- # puts '-'*175
105
- # ap minion.droplet
106
- # Refresh droplet (didn't find a reload method)
107
- droplet_id = minion.droplet.id.to_s
108
- # ap droplet_id
109
- minion.droplet = Pvcglue::DigitalOcean.client.droplets.find(id: droplet_id)
110
- # puts '='*175
111
- # ap minion.droplet
112
- ip_addresses = Pvcglue::DigitalOcean.get_ip_addresses(minion.droplet)
113
- data = update_minion_data(minion, ip_addresses, droplet_id, data)
114
- minion.public_ip = ip_addresses.public
115
- minion.private_ip = ip_addresses.private
116
- minion.cloud_id = droplet_id
105
+ # # puts '-'*175
106
+ # # ap minion.droplet
107
+ # # Refresh droplet (didn't find a reload method)
108
+ # droplet_id = minion.droplet.id.to_s
109
+ # # ap droplet_id
110
+ # minion.droplet = Pvcglue::CloudProvider.client.droplets.find(id: droplet_id)
111
+ # # puts '='*175
112
+ # # ap minion.droplet
113
+ # ip_addresses = Pvcglue::CloudProvider.get_ip_addresses(minion.droplet)
114
+ # data = update_minion_data(minion, ip_addresses, droplet_id, data)
115
+ # minion.public_ip = ip_addresses.public
116
+ # minion.private_ip = ip_addresses.private
117
+ # minion.cloud_id = droplet_id
118
+ # minion
119
+
120
+ minion.machine = minion.pvc_cloud_provider.reload_machine_data(minion)
121
+ data = update_minion_data(minion, data)
122
+ minion.public_ip = minion.machine.public_ip
123
+ minion.private_ip = minion.machine.private_ip
124
+ minion.cloud_id = minion.machine.id
125
+
117
126
  minion
118
127
  end
119
128
  File.write(Pvcglue.cloud.local_file_name, data)
@@ -121,16 +130,17 @@ module Pvcglue
121
130
  updated_minions
122
131
  end
123
132
 
124
- def update_minion_data(minion, ip_addresses, cloud_id, data)
125
- unless minion.public_ip_address.nil? && minion.private_id_address.nil? && minion.cloud_id.nil?
126
- raise("#{minion.machine_name} has previously defined ip address(es) or cloud_id, can not change.")
133
+ # def update_minion_data(minion, ip_addresses, cloud_id, data)
134
+ def update_minion_data(minion, data)
135
+ unless minion.public_ip.nil? && minion.private_ip.nil? && minion.cloud_id.nil?
136
+ raise("#{minion.machine_name} has previously defined ip address(es) or id, can not change. As a safety measure, you will need to manually remove any old data")
127
137
  end
128
- if ip_addresses.public.nil? || ip_addresses.private.nil? || cloud_id.nil?
129
- raise("New IP addresses (#{ip_addresses}) or cloud_id (#{cloud_id}) are not valid.")
138
+ if minion.machine.public_ip.nil? || minion.machine.private_ip.nil? || minion.machine.id.nil?
139
+ raise("New public IP address (#{minion.machine.public_ip}) or private IP address (#{minion.machine.private_ip}) or cloud_id (#{minion.machine.id}) are not valid.")
130
140
  end
131
141
 
132
142
 
133
- replacement = "\\1\\2\n\\1public_ip = '#{ip_addresses.public}'\n\\1private_ip = '#{ip_addresses.private}'\n\\1cloud_id = '#{cloud_id}'"
143
+ replacement = "\\1\\2\n\\1public_ip = '#{minion.machine.public_ip}'\n\\1private_ip = '#{minion.machine.private_ip}'\n\\1cloud_id = '#{minion.machine.id}'"
134
144
  new_data = data.sub(/( *)(name\s*=\s*['"]#{Regexp.quote(minion.machine_name)}['"])/, replacement)
135
145
  raise "Unable to update minion data for #{minion.machine_name}." if data == new_data
136
146
 
@@ -145,25 +155,11 @@ module Pvcglue
145
155
  new_data
146
156
  end
147
157
 
148
- def droplets
149
- @droplets ||= Pvcglue::DigitalOcean.client.droplets.all
150
- end
151
-
152
158
  def get_lazy_minions(minions)
153
- droplets = Pvcglue::DigitalOcean.client.droplets.all
154
-
155
- minions.select do |minion_name, minion|
159
+ minions.select do |minion|
156
160
  Pvcglue.logger_current_minion = minion
157
- # next unless minion.machine_name == 'staging-lb'
158
- # ap minion_name
159
- found = droplets.detect do |droplet|
160
- droplet[:name] == minion.machine_name
161
- end
162
- # ap found
163
- # ap found[:status]
164
- !found || found[:status] != 'active'
161
+ !minion.pvc_cloud_provider.ready?(minion)
165
162
  end
166
- # ap minions
167
163
  end
168
164
 
169
165
  end
@@ -0,0 +1,182 @@
1
+ ################################################################################
2
+ # === Pvcglue Manager configuration file ===
3
+ ################################################################################
4
+
5
+
6
+ # ----------------- USERS ------------------------------------------------------
7
+ [[users]]
8
+ name = 'Bob'
9
+ github_user_name = "bob" # Get public keys from https://github.com/bob.keys
10
+
11
+ [[users]]
12
+ name = 'Rob'
13
+ [users.public_keys]
14
+ key_1 = "ssh-rsa Example 1..."
15
+ key_2 = "ssh-rsa Example 2..."
16
+
17
+
18
+ # ----------------- GROUPS -----------------------------------------------------
19
+ [groups]
20
+ manager_root_users = ['Bob', 'Rob']
21
+ manager_users = ["==manager_root_users=="]
22
+
23
+ lead_developers = ['Bob', 'Rob']
24
+ developers = ['==lead_developers==']
25
+ all_developers = ["==lead_developers==", "==developers=="]
26
+
27
+
28
+ # ----------------- PROJECTS ---------------------------------------------------
29
+ [[projects]]
30
+ name = "project_name"
31
+ user_name_base = "project_name"
32
+ repo_url = "git@github.com:bob/project_name.git"
33
+ excluded_db_tables = ["versions"]
34
+
35
+ [projects.gems]
36
+ # delayed_job = true
37
+ # resque = true
38
+ # whenever = true
39
+
40
+ # swapfile_size = 128
41
+ time_zone = "UTC" # TODO: This needs to be at the machine level
42
+
43
+ [[projects.stages]]
44
+ name = 'alpha'
45
+ db_rebuild = true
46
+ domains = ["sub.example.com"]
47
+ ssl = "none"
48
+
49
+ [[projects.stages.stack]]
50
+ role = 'lb'
51
+ machine_name = '==staging-lb=='
52
+
53
+ [[projects.stages.stack]]
54
+ role = 'web'
55
+ role_index = 1
56
+ machine_name = '==staging-web-1=='
57
+
58
+ [[projects.stages.stack]]
59
+ role = 'web'
60
+ role_index = 2
61
+ machine_name = '==staging-web-2=='
62
+
63
+ [[projects.stages.stack]]
64
+ role = 'worker'
65
+ role_index = 1
66
+ machine_name = '==staging-worker-1=='
67
+ resque_workers = 2
68
+ delayed_job_workers = 2
69
+
70
+ [[projects.stages.stack]]
71
+ role = 'worker'
72
+ role_index = 2
73
+ machine_name = '==staging-web-2=='
74
+ resque_workers = 2
75
+ delayed_job_workers = 2
76
+
77
+ [[projects.stages.stack]]
78
+ role = 'mc'
79
+ machine_name = '==staging-mc=='
80
+
81
+ [[projects.stages.stack]]
82
+ role = 'pg'
83
+ machine_name = '==staging-pg=='
84
+
85
+ [[projects.stages]]
86
+ name = 'beta'
87
+ db_rebuild = true
88
+ domains = ["beta.example.com"]
89
+ ssl = "acme" # DNS must be set up first!
90
+
91
+ [[projects.stages.stack]]
92
+ role = 'lb'
93
+ machine_name = '==staging-lb=='
94
+
95
+ [[projects.stages.stack]]
96
+ role = 'web'
97
+ role_index = 1
98
+ machine_name = '==staging-web-1=='
99
+
100
+ [[projects.stages.stack]]
101
+ role = 'pg'
102
+ machine_name = '==staging-pg=='
103
+
104
+
105
+ # ----------------- MACHINES ---------------------------------------------------
106
+ [[machines]]
107
+ name = 'staging-lb'
108
+ root_users = "==lead_developers=="
109
+ users = "==all_developers=="
110
+
111
+ [[machines]]
112
+ name = 'staging-web-1'
113
+ root_users = "==lead_developers=="
114
+ users = "==all_developers=="
115
+
116
+ [[machines]]
117
+ name = 'staging-web-2'
118
+ tags = ['development', 'web']
119
+ root_users = "==lead_developers=="
120
+ users = "==all_developers=="
121
+
122
+ [[machines]]
123
+ name = 'staging-worker-1'
124
+ root_users = "==lead_developers=="
125
+ users = "==all_developers=="
126
+
127
+ [[machines]]
128
+ name = 'staging-pg'
129
+ root_users = "==lead_developers=="
130
+ users = "==all_developers=="
131
+
132
+ [[machines]]
133
+ name = 'staging-mc'
134
+ root_users = "==lead_developers=="
135
+ users = "==all_developers=="
136
+
137
+ [[machines]]
138
+ name = 'staging-redis'
139
+ root_users = "==lead_developers=="
140
+ users = "==all_developers=="
141
+
142
+
143
+ # ----------------- CLOUD ------------------------------------------------------
144
+ [cloud_provider]
145
+ name = 'digital-ocean'
146
+ image = 'ubuntu-16-04-x64'
147
+
148
+ #region = 'nyc1' # New York 1
149
+ #region = 'sfo1' # San Francisco 1
150
+ #region = 'nyc2' # New York 2
151
+ #region = 'ams2' # Amsterdam 2
152
+ #region = 'sgp1' # Singapore 1
153
+ #region = 'lon1' # London 1
154
+ #region = 'nyc3' # New York 3
155
+ #region = 'ams3' # Amsterdam 3
156
+ #region = 'fra1' # Frankfurt 1
157
+ #region = 'tor1' # Toronto 1
158
+ region = 'sfo2' # San Francisco 2
159
+ #region = 'blr1' # Bangalore 1
160
+
161
+ # can't use 'size' as a key
162
+ default_capacity = '512mb'
163
+ #default_capacity = '1gb'
164
+ #default_capacity = '2gb'
165
+ #default_capacity = '4gb'
166
+ #default_capacity = '8gb'
167
+ #default_capacity = '16gb'
168
+ #default_capacity = 'm-16gb'
169
+ #default_capacity = '32gb'
170
+ #default_capacity = 'm-32gb'
171
+ #default_capacity = '48gb'
172
+ #default_capacity = 'm-64gb'
173
+ #default_capacity = '64gb'
174
+ #default_capacity = 'm-128gb'
175
+ #default_capacity = 'm-224gb'
176
+
177
+ [cloud_provider.initial_users]
178
+ "Bob" = "d1:fe:e8:53:d4:fb:eb:f1:db:fc:ef:18:f1:cf:1e:5d"
179
+ "Rob" = "d1:fe:e8:53:d4:fb:eb:f1:db:fc:ef:18:f1:cf:1e:5d"
180
+
181
+
182
+
@@ -1,3 +1,3 @@
1
1
  module Pvcglue
2
- VERSION = '0.9.3'
2
+ VERSION = '0.9.4'
3
3
  end
@@ -20,10 +20,12 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency 'bundler', '>= 1.3.0', '< 2.0'
22
22
  spec.add_development_dependency 'rake', '~> 10.1'
23
+ spec.add_development_dependency 'byebug'
24
+ # spec.add_development_dependency 'pry'
23
25
 
24
26
  spec.add_dependency 'thor', '~> 0.19', '>= 0.19.1'
25
27
  spec.add_dependency 'toml-rb', '~> 0.3', '>= 0.3.15'
26
- spec.add_dependency 'orca', '= 0.4', '= 0.4.0'
28
+ # spec.add_dependency 'orca', '= 0.4', '= 0.4.0'
27
29
  spec.add_dependency 'capistrano', '~> 3.4.0', '>= 3.4.1'
28
30
  spec.add_dependency 'capistrano-bundler', '~> 1.1', '>= 1.1.1'
29
31
  spec.add_dependency 'capistrano-rails', '~> 1.1', '>= 1.1.1'
@@ -33,6 +35,6 @@ Gem::Specification.new do |spec|
33
35
  spec.add_dependency 'hashie'
34
36
  spec.add_dependency 'droplet_kit'
35
37
  spec.add_dependency 'paint'
36
- spec.add_dependency 'pry'
38
+ spec.add_dependency 'tilt'
37
39
 
38
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pvcglue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - T. Andrew Lyric
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-24 00:00:00.000000000 Z
11
+ date: 2017-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -44,6 +44,20 @@ dependencies:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '10.1'
47
+ - !ruby/object:Gem::Dependency
48
+ name: byebug
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: thor
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -84,26 +98,6 @@ dependencies:
84
98
  - - ">="
85
99
  - !ruby/object:Gem::Version
86
100
  version: 0.3.15
87
- - !ruby/object:Gem::Dependency
88
- name: orca
89
- requirement: !ruby/object:Gem::Requirement
90
- requirements:
91
- - - '='
92
- - !ruby/object:Gem::Version
93
- version: '0.4'
94
- - - '='
95
- - !ruby/object:Gem::Version
96
- version: 0.4.0
97
- type: :runtime
98
- prerelease: false
99
- version_requirements: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - '='
102
- - !ruby/object:Gem::Version
103
- version: '0.4'
104
- - - '='
105
- - !ruby/object:Gem::Version
106
- version: 0.4.0
107
101
  - !ruby/object:Gem::Dependency
108
102
  name: capistrano
109
103
  requirement: !ruby/object:Gem::Requirement
@@ -261,7 +255,7 @@ dependencies:
261
255
  - !ruby/object:Gem::Version
262
256
  version: '0'
263
257
  - !ruby/object:Gem::Dependency
264
- name: pry
258
+ name: tilt
265
259
  requirement: !ruby/object:Gem::Requirement
266
260
  requirements:
267
261
  - - ">="
@@ -293,17 +287,19 @@ files:
293
287
  - images/pvcglue.gliffy
294
288
  - images/pvcglue.png
295
289
  - lib/pvcglue.rb
296
- - lib/pvcglue/all_the_things.rb
297
290
  - lib/pvcglue/bootstrap.rb
298
291
  - lib/pvcglue/capistrano.rb
299
292
  - lib/pvcglue/cli.rb
300
293
  - lib/pvcglue/cloud.rb
294
+ - lib/pvcglue/cloud_providers.rb
295
+ - lib/pvcglue/cloud_providers/digital_ocean.rb
296
+ - lib/pvcglue/cloud_providers/linode.rb
301
297
  - lib/pvcglue/configuration.rb
302
298
  - lib/pvcglue/connection.rb
303
299
  - lib/pvcglue/custom_hashie.rb
304
300
  - lib/pvcglue/db.rb
305
301
  - lib/pvcglue/deploy.rb
306
- - lib/pvcglue/digital_ocean.rb
302
+ - lib/pvcglue/docs.rb
307
303
  - lib/pvcglue/env.rb
308
304
  - lib/pvcglue/local.rb
309
305
  - lib/pvcglue/manager.rb
@@ -379,6 +375,7 @@ files:
379
375
  - lib/pvcglue/templates/passenger.list.erb
380
376
  - lib/pvcglue/templates/pg_hba.conf.erb
381
377
  - lib/pvcglue/templates/postgresql.conf.erb
378
+ - lib/pvcglue/templates/pvc_manager.toml.erb
382
379
  - lib/pvcglue/templates/redis.conf.erb
383
380
  - lib/pvcglue/templates/sshd_config.erb
384
381
  - lib/pvcglue/templates/stage-deploy.rb.erb