pvcglue 0.9.3 → 0.9.4

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.
@@ -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