vmc_knife 0.0.13 → 0.0.40
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/vmc_knife/cli_extensions.rb +41 -21
- data/lib/vmc_knife/commands/knife_cmds.rb +58 -10
- data/lib/vmc_knife/data_services.rb +47 -33
- data/lib/vmc_knife/vmc_helper.rb +4 -0
- data/lib/vmc_knife/vmc_knife.rb +413 -32
- metadata +55 -98
@@ -93,11 +93,19 @@ class VMC::Cli::KnifeRunner < VMC::Cli::Runner
|
|
93
93
|
when 'upload-applications','upload-apps'
|
94
94
|
usage('vmc_knife upload-apps [<applications_regexp>]')
|
95
95
|
@args.shift # consumes the argument.
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
96
|
+
set_cmd(:knifeapps, :upload_applications, @args.size)
|
97
|
+
when 'update-applications','update-apps'
|
98
|
+
usage('vmc_knife update-apps [<applications_regexp>]')
|
99
|
+
@args.shift # consumes the argument.
|
100
|
+
set_cmd(:knifeapps, :update_applications, @args.size)
|
101
|
+
when 'patch-applications','patch-apps'
|
102
|
+
usage('vmc_knife patch-apps [<applications_regexp>]')
|
103
|
+
@args.shift # consumes the argument.
|
104
|
+
set_cmd(:knifeapps, :patch_applications, @args.size)
|
105
|
+
when 'extract-deployed-apps', 'extract-apps'
|
106
|
+
usage('vmc_knife extract-deployed-apps [<applications_regexp>]')
|
107
|
+
@args.shift # consumes the argument.
|
108
|
+
set_cmd(:knifeapps, :extract_deployed_applications, @args.size)
|
101
109
|
when 'start-applications','start-apps'
|
102
110
|
usage('vmc_knife start-apps [<applications_regexp>]')
|
103
111
|
@args.shift # consumes the argument.
|
@@ -122,14 +130,34 @@ class VMC::Cli::KnifeRunner < VMC::Cli::Runner
|
|
122
130
|
else
|
123
131
|
set_cmd(:knifeapps, :restart_applications, @args.size) # too many
|
124
132
|
end
|
133
|
+
when 'info-applications','info-apps','version-apps'
|
134
|
+
usage('vmc_knife info-apps [<applications_regexp>]')
|
135
|
+
@args.shift # consumes the argument.
|
136
|
+
set_cmd(:knifeapps, :info_applications, @args.size)
|
137
|
+
when 'running-apps?', 'running-apps'
|
138
|
+
usage('vmc_knife running?-apps [<applications_regexp>]')
|
139
|
+
@args.shift # consumes the argument.
|
140
|
+
set_cmd(:knifeapps, :running_applications?, @args.size)
|
141
|
+
when 'wait-till-running-apps'
|
142
|
+
usage('vmc_knife wait-till-running-apps [<applications_regexp>]')
|
143
|
+
@args.shift # consumes the argument.
|
144
|
+
set_cmd(:knifeapps, :wait_till_running_applications, @args.size)
|
145
|
+
when 'info-configure','info-configure-apps'
|
146
|
+
usage('vmc_knife info-configure [<applications_regexp>]')
|
147
|
+
@args.shift # consumes the argument.
|
148
|
+
set_cmd(:knifeapps, :info_configure, @args.size)
|
125
149
|
when 'delete-all'
|
126
150
|
usage('vmc_knife delete-all [<applications_regexp>]')
|
127
151
|
@args.shift # consumes the argument.
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
152
|
+
set_cmd(:knifeapps, :delete_all, @args.size)
|
153
|
+
when 'delete-apps'
|
154
|
+
usage('vmc_knife delete-apps [<applications_regexp>]')
|
155
|
+
@args.shift # consumes the argument.
|
156
|
+
set_cmd(:knifeapps, :delete_apps, @args.size)
|
157
|
+
when 'delete-data','delete-services'
|
158
|
+
usage('vmc_knife delete-data [<data_regexp>]')
|
159
|
+
@args.shift # consumes the argument.
|
160
|
+
set_cmd(:knifeapps, :delete_data, @args.size)
|
133
161
|
when 'data-shell','psql','mongo'
|
134
162
|
usage('vmc_knife data-shell [<data-service-name>] [<app-name>] [<cmd-file> or <quoted-cmd>]')
|
135
163
|
@args.shift # consumes the argument.
|
@@ -173,19 +201,11 @@ class VMC::Cli::KnifeRunner < VMC::Cli::Runner
|
|
173
201
|
when 'data-import'
|
174
202
|
usage('vmc_knife data-import [<data-service-name>] [<archive-file-name>] [<tables-collection-regexp>]')
|
175
203
|
@args.shift # consumes the argument.
|
176
|
-
|
177
|
-
set_cmd(:knifeapps, :data_import, @args.size)
|
178
|
-
else
|
179
|
-
set_cmd(:knifeapps, :data_import, @args.size) # too many
|
180
|
-
end
|
204
|
+
set_cmd(:knifeapps, :data_import, @args.size)
|
181
205
|
when 'data-export'
|
182
206
|
usage('vmc_knife data-export [<data-service-name>] [<archive-file-name>] [<tables-collection-regexp>]')
|
183
207
|
@args.shift # consumes the argument.
|
184
|
-
|
185
|
-
set_cmd(:knifeapps, :data_export, @args.size)
|
186
|
-
else
|
187
|
-
set_cmd(:knifeapps, :data_export, @args.size) # too many
|
188
|
-
end
|
208
|
+
set_cmd(:knifeapps, :data_export, @args.size)
|
189
209
|
when 'logs','logs-all'
|
190
210
|
usage('vmc_knife logs-all')
|
191
211
|
@args.shift # consumes the argument.
|
@@ -224,7 +244,7 @@ class VMC::Cli::KnifeRunner < VMC::Cli::Runner
|
|
224
244
|
`cd /tmp; [ -d "vmc-knife" ] && rm -rf vmc-knife; git clone https://github.com/hmalphettes/vmc-knife.git; cd vmc-knife; gem build vmc_knife.gemspec; gem install vmc_knife`
|
225
245
|
exit 0
|
226
246
|
when 'help'
|
227
|
-
display "vmc_knife expand-manifest|login|start/stop/restart-apps|upload-apps|configure-all|configure-recipes|configure-apps|configure-services|delete-all|configure-vcap|configure-vcap-mdns|configure-vcap-etc-hosts|data-shell|data-export/import/shrink/drop|logs-less|less|tail|logs-all/apps/vcap|update-self [<manifest_path>]"
|
247
|
+
display "vmc_knife expand-manifest|login|start/stop/restart-apps|upload-apps|configure-all|configure-recipes|configure-apps|configure-services|info-configure-apps|info-apps|update-apps|patch-apps|running-apps|wait-till-running-apps|delete-app/data/all|configure-vcap|configure-vcap-mdns|configure-vcap-etc-hosts|data-shell|data-export/import/shrink/drop|logs-less|less|tail|logs-all/apps/vcap|update-self [<manifest_path>]"
|
228
248
|
else
|
229
249
|
super
|
230
250
|
end
|
@@ -213,10 +213,21 @@ module VMC::Cli::Command
|
|
213
213
|
end
|
214
214
|
configurer.execute
|
215
215
|
end
|
216
|
-
|
217
216
|
def upload_applications(app_names_regexp=nil,manifest_file_path=nil)
|
218
217
|
recipe_configuror(:upload,nil,app_names_regexp,nil,manifest_file_path,
|
219
|
-
{:apps_only=>true})
|
218
|
+
{:apps_only=>true, :force=>@options[:force]})
|
219
|
+
end
|
220
|
+
def update_applications(app_names_regexp=nil,manifest_file_path=nil)
|
221
|
+
recipe_configuror(:update,nil,app_names_regexp,nil,manifest_file_path,
|
222
|
+
{:apps_only=>true, :force=>@options[:force]})
|
223
|
+
end
|
224
|
+
def patch_applications(app_names_regexp=nil,manifest_file_path=nil)
|
225
|
+
recipe_configuror(:patch,nil,app_names_regexp,nil,manifest_file_path,
|
226
|
+
{:apps_only=>true, :force=>@options[:force]})
|
227
|
+
end
|
228
|
+
def extract_deployed_applications(app_names_regexp=nil,manifest_file_path=nil)
|
229
|
+
recipe_configuror(:extract_deployed,nil,app_names_regexp,nil,manifest_file_path,
|
230
|
+
{:apps_only=>true, :force=>@options[:force]})
|
220
231
|
end
|
221
232
|
def start_applications(app_names_regexp=nil,manifest_file_path=nil)
|
222
233
|
recipe_configuror(:start,nil,app_names_regexp,nil,manifest_file_path,
|
@@ -230,9 +241,37 @@ module VMC::Cli::Command
|
|
230
241
|
recipe_configuror(:restart,nil,app_names_regexp,nil,manifest_file_path,
|
231
242
|
{:apps_only=>true})
|
232
243
|
end
|
244
|
+
def info_applications(app_names_regexp=nil,manifest_file_path=nil)
|
245
|
+
res=recipe_configuror(:info,nil,app_names_regexp,nil,manifest_file_path,
|
246
|
+
{:apps_only=>true})
|
247
|
+
exit 1 unless res
|
248
|
+
end
|
249
|
+
def wait_till_running_applications(app_names_regexp=nil,manifest_file_path=nil)
|
250
|
+
res=recipe_configuror(:running_applications?,nil,app_names_regexp,nil,manifest_file_path,
|
251
|
+
{:apps_only=>true, :wait=>{:interval=>30,:retries=>6}})
|
252
|
+
exit 1 unless res
|
253
|
+
end
|
254
|
+
def running_applications?(app_names_regexp=nil,manifest_file_path=nil)
|
255
|
+
res=recipe_configuror(:running_applications?,nil,app_names_regexp,nil,manifest_file_path,
|
256
|
+
{:apps_only=>true})
|
257
|
+
exit 1 unless res
|
258
|
+
end
|
259
|
+
def info_configure(app_names_regexp=nil,manifest_file_path=nil)
|
260
|
+
res=recipe_configuror(:info,nil,app_names_regexp,nil,manifest_file_path,
|
261
|
+
{:apps_only=>true, :configure_only=>true})
|
262
|
+
exit 1 unless res
|
263
|
+
end
|
233
264
|
def delete_all(app_names_regexp=nil,manifest_file_path=nil)
|
234
265
|
recipe_configuror(:delete,nil,app_names_regexp,nil,manifest_file_path)
|
235
266
|
end
|
267
|
+
def delete_apps(app_names_regexp=nil,manifest_file_path=nil)
|
268
|
+
recipe_configuror(:delete,nil,app_names_regexp,nil,manifest_file_path,
|
269
|
+
{:apps_only=>true})
|
270
|
+
end
|
271
|
+
def delete_data(services_names_regexp=nil,manifest_file_path=nil)
|
272
|
+
recipe_configuror(:delete,nil,nil,services_names_regexp,manifest_file_path,
|
273
|
+
{:data_only=>true})
|
274
|
+
end
|
236
275
|
def data_shell(data_names_regexp=nil,file_or_cmd=nil,app_name=nil,manifest_file_path=nil)
|
237
276
|
file_name = nil
|
238
277
|
cmd = nil
|
@@ -245,7 +284,9 @@ module VMC::Cli::Command
|
|
245
284
|
end
|
246
285
|
end
|
247
286
|
recipe_configuror(:shell,nil,nil,data_names_regexp,manifest_file_path,
|
248
|
-
{:file_name=>file_name, :data_cmd=>cmd,
|
287
|
+
{:file_name=>file_name, :data_cmd=>cmd,
|
288
|
+
:app_name=>app_name, :data_only=>true,
|
289
|
+
:single_service=>true})
|
249
290
|
end
|
250
291
|
def data_credentials(data_names_regexp=nil,manifest_file_path=nil)
|
251
292
|
recipe_configuror(:credentials,nil,nil,data_names_regexp,manifest_file_path,
|
@@ -271,9 +312,9 @@ module VMC::Cli::Command
|
|
271
312
|
recipe_configuror(:shrink,nil,nil,data_names_regexp,manifest_file_path,
|
272
313
|
{:collection_or_table_names=>collection_or_table_names, :data_only=>true})
|
273
314
|
end
|
274
|
-
def logs_all(app_names_regexp=nil, manifest_file_path=nil)
|
315
|
+
def logs_all(app_names_regexp=nil, output_file=nil, manifest_file_path=nil)
|
275
316
|
recipe_configuror(:logs,nil,app_names_regexp,nil,manifest_file_path,
|
276
|
-
{:apps_only=>true, :log_apps=>true, :log_vcap=>true})
|
317
|
+
{:apps_only=>true, :output_file=>output_file, :log_apps=>true, :log_vcap=>true})
|
277
318
|
end
|
278
319
|
def logs_apps(app_names_regexp=nil, manifest_file_path=nil)
|
279
320
|
recipe_configuror(:logs,nil,app_names_regexp,nil,manifest_file_path,
|
@@ -298,18 +339,25 @@ module VMC::Cli::Command
|
|
298
339
|
man = load_manifest(manifest_file_path)
|
299
340
|
recipes_regexp = as_regexp(recipes_regexp)
|
300
341
|
app_names_regexp = as_regexp(app_names_regexp)
|
301
|
-
|
302
|
-
|
342
|
+
opts ||= {}
|
343
|
+
service_names_regexp = as_regexp(service_names_regexp, opts[:single_service])
|
344
|
+
configurer = VMC::KNIFE::RecipesConfigurationApplier.new(man, client,
|
345
|
+
recipes_regexp, app_names_regexp,
|
346
|
+
service_names_regexp, opts)
|
303
347
|
method_object = configurer.method(method_sym_name)
|
304
348
|
method_object.call
|
305
349
|
end
|
306
350
|
|
307
|
-
def as_regexp(arg)
|
351
|
+
def as_regexp(arg, strict=false)
|
308
352
|
if arg != nil && arg.kind_of?(String) && !arg.strip.empty?
|
309
|
-
Regexp.
|
353
|
+
if strict && Regexp.quote(arg) == arg
|
354
|
+
Regexp.new('^'+arg+'$')
|
355
|
+
else
|
356
|
+
Regexp.new(arg)
|
357
|
+
end
|
310
358
|
end
|
311
359
|
end
|
312
360
|
|
313
361
|
end
|
314
362
|
|
315
|
-
end
|
363
|
+
end
|
@@ -30,14 +30,14 @@ module VMC
|
|
30
30
|
|
31
31
|
def self.get_app_id(app_name)
|
32
32
|
db=get_ccdb_credentials()
|
33
|
-
app_id = `psql --username #{db['username']} --dbname #{db['database']} -c \"select id from apps where name='#{app_name}'\" #{PSQL_RAW_RES_ARGS}
|
34
|
-
app_id
|
33
|
+
app_id = `psql --username #{db['username']} --dbname #{db['database']} -c \"select id from apps where name='#{app_name}'\" #{PSQL_RAW_RES_ARGS}`.strip
|
34
|
+
app_id unless app_id.empty?
|
35
35
|
end
|
36
36
|
def self.get_service_config_id(service_name)
|
37
37
|
db=get_ccdb_credentials()
|
38
38
|
#todo add the user_id
|
39
|
-
service_config_id = `psql --username #{db['username']} --dbname #{db['database']} -c \"select id from service_configs where alias='#{service_name}'\" #{PSQL_RAW_RES_ARGS}
|
40
|
-
service_config_id
|
39
|
+
service_config_id = `psql --username #{db['username']} --dbname #{db['database']} -c \"select id from service_configs where alias='#{service_name}'\" #{PSQL_RAW_RES_ARGS}`.strip
|
40
|
+
service_config_id unless service_config_id.empty?
|
41
41
|
end
|
42
42
|
|
43
43
|
# Returns a hash of the credentials for a data-service
|
@@ -65,11 +65,15 @@ module VMC
|
|
65
65
|
def self.get_credentials(service_name, app_name=nil)
|
66
66
|
db=get_ccdb_credentials()
|
67
67
|
if app_name.nil?
|
68
|
-
credentials_str = `psql --username #{db['username']} --dbname #{db['database']} -c \"select credentials from service_configs where alias='#{service_name}'\" #{PSQL_RAW_RES_ARGS}
|
68
|
+
credentials_str = `psql --username #{db['username']} --dbname #{db['database']} -c \"select credentials from service_configs where alias='#{service_name}'\" #{PSQL_RAW_RES_ARGS}`.strip
|
69
69
|
else
|
70
70
|
app_id = get_app_id(app_name)
|
71
|
+
if app_id.nil?
|
72
|
+
puts "WARN: No application named #{app_name} exists at this point" if VMC::Cli::Config.trace
|
73
|
+
return
|
74
|
+
end
|
71
75
|
service_config_id = get_service_config_id(service_name)
|
72
|
-
credentials_str = `psql --username #{db['username']} --dbname #{db['database']} -c \"select credentials from service_bindings where app_id = '#{app_id}' and service_config_id='#{service_config_id}'\" #{PSQL_RAW_RES_ARGS}
|
76
|
+
credentials_str = `psql --username #{db['username']} --dbname #{db['database']} -c \"select credentials from service_bindings where app_id = '#{app_id}' and service_config_id='#{service_config_id}'\" #{PSQL_RAW_RES_ARGS}`.strip
|
73
77
|
end
|
74
78
|
res = Hash.new
|
75
79
|
credentials_str.split("\n").each do | line |
|
@@ -116,14 +120,13 @@ module VMC
|
|
116
120
|
elsif exec_name == 'mongodump'
|
117
121
|
db_arg = "" # dump all the databases including 'admin' which contains the users.
|
118
122
|
else
|
119
|
-
db_arg = "--db #{credentials_hash['db']}"
|
123
|
+
db_arg = " --db #{credentials_hash['db']}"
|
120
124
|
end
|
121
|
-
cmd = "#{mongo_shell} -u #{credentials_hash['username']} -p #{credentials_hash['password']} #{credentials_hash['hostname']}:#{credentials_hash['port']}#{db_arg}"
|
125
|
+
cmd = "#{mongo_shell} -u #{credentials_hash['username']} -p #{credentials_hash['password']} #{'-h' if(exec_name=='mongorestore')} #{credentials_hash['hostname']}:#{credentials_hash['port']}#{db_arg}"
|
122
126
|
if commands_file
|
123
|
-
if
|
127
|
+
if exec_name == 'mongo'
|
124
128
|
if File.exists? commands_file
|
125
|
-
|
126
|
-
commands_file = "--eval \"#{`cat commands_file`}"
|
129
|
+
commands_file = "--eval \"`cat #{commands_file}`\""
|
127
130
|
else
|
128
131
|
commands_file = "--eval \"#{commands_file}\""
|
129
132
|
end
|
@@ -232,6 +235,7 @@ module VMC
|
|
232
235
|
include Interactive
|
233
236
|
|
234
237
|
# The credentials hash for this data-service
|
238
|
+
# param app_name The favored app usually bound to this data_service
|
235
239
|
def credentials(app_name=nil)
|
236
240
|
#bound_app is the name of an app bound to the dat-service and that credentials
|
237
241
|
#should be used to access the data-service.
|
@@ -267,7 +271,11 @@ module VMC
|
|
267
271
|
file=File.expand_path(file,current_wd)
|
268
272
|
basename = File.basename(file).to_s
|
269
273
|
end
|
270
|
-
|
274
|
+
|
275
|
+
unless File.exists?(basename)
|
276
|
+
Dir.foreach(Dir.pwd) { |f|
|
277
|
+
File.delete(f) unless f == '.' || f == '..'
|
278
|
+
}
|
271
279
|
if file =~ /^https?:\/\// || file =~ /^ftp:\/\//
|
272
280
|
wget_args = @wrapped['director']['wget_args']
|
273
281
|
if wget_args.nil?
|
@@ -279,11 +287,11 @@ module VMC
|
|
279
287
|
end
|
280
288
|
`wget #{wget_args_str} --output-document=#{basename} #{file}`
|
281
289
|
if $? != 0
|
282
|
-
|
290
|
+
File.delete("#{data_download_dir}/#{basename}")
|
283
291
|
raise "Unable to successfully download #{file}"
|
284
292
|
end
|
285
293
|
else
|
286
|
-
|
294
|
+
FileUtils.cp(file, basename)
|
287
295
|
end
|
288
296
|
end
|
289
297
|
#unzip if necessary (in progress)
|
@@ -302,7 +310,7 @@ module VMC
|
|
302
310
|
if is_unzipped
|
303
311
|
#`rm #{basename}`
|
304
312
|
files = Dir.glob("*.sql") if is_postgresql
|
305
|
-
files = Dir.glob("
|
313
|
+
files = Dir.glob("**/*.bson") if is_mongodb
|
306
314
|
files ||= Dir.glob("*")
|
307
315
|
raise "Can't find the db-dump file." if files.empty?
|
308
316
|
file = files.first
|
@@ -310,10 +318,11 @@ module VMC
|
|
310
318
|
file = basename
|
311
319
|
end
|
312
320
|
|
321
|
+
creds=credentials(app_name)
|
322
|
+
|
313
323
|
if is_postgresql
|
314
324
|
p "chmod o+w #{file}"
|
315
325
|
`chmod o+w #{file}`
|
316
|
-
creds=credentials(app_name)
|
317
326
|
if /\.sql$/ =~ file
|
318
327
|
other_params="--file #{file} --quiet"
|
319
328
|
cmd = VMC::KNIFE.pg_connect_cmd(creds, 'psql',as_admin=false, other_params)
|
@@ -324,7 +333,7 @@ module VMC
|
|
324
333
|
#`pg_restore --dbname=#{dbname} --username=#{username} --no-acl --no-privileges --no-owner #{file}`
|
325
334
|
end
|
326
335
|
puts cmd
|
327
|
-
puts `#{cmd}
|
336
|
+
puts `#{cmd}`.strip
|
328
337
|
`chmod o-w #{file}`
|
329
338
|
elsif is_mongodb
|
330
339
|
|
@@ -338,7 +347,7 @@ module VMC
|
|
338
347
|
if File.exists?(mongod_lock) && File.size(mongod_lock)>0
|
339
348
|
# the mongodb instance is currently working. connect to it and do the work.
|
340
349
|
# in that case import the 'db' alone. don't do the 'admin'
|
341
|
-
VMC::KNIFE.data_service_console(creds, File.dirname(file),false,'mongorestore')
|
350
|
+
VMC::KNIFE.data_service_console(creds, File.dirname(file), false, 'mongorestore')
|
342
351
|
else
|
343
352
|
# the mongodb instance is not currently working
|
344
353
|
# go directly on the filesystem
|
@@ -442,14 +451,15 @@ module VMC
|
|
442
451
|
# Another workaround though really not perfect so it will stay in vmc_knife:
|
443
452
|
# the ownership of the SQL functions.
|
444
453
|
def apply_privileges(app_name=nil)
|
454
|
+
return if credentials(app_name).nil?
|
445
455
|
if is_postgresql()
|
446
456
|
cmd_acl="GRANT CREATE ON SCHEMA PUBLIC TO PUBLIC;\
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
457
|
+
GRANT ALL ON ALL TABLES IN SCHEMA PUBLIC TO PUBLIC;\
|
458
|
+
GRANT ALL ON ALL FUNCTIONS IN SCHEMA PUBLIC TO PUBLIC;\
|
459
|
+
GRANT ALL ON ALL SEQUENCES IN SCHEMA PUBLIC TO PUBLIC;\
|
460
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO PUBLIC;\
|
461
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO PUBLIC;\
|
462
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO PUBLIC;"
|
453
463
|
# shell(cmd_acl,true)
|
454
464
|
|
455
465
|
# reset the owner of the functions to the current user
|
@@ -465,14 +475,18 @@ module VMC
|
|
465
475
|
return
|
466
476
|
end
|
467
477
|
fcts_name=shell(cmd_select_fcts,true,true)
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
478
|
+
if fcts_name.empty?
|
479
|
+
puts "No need to re-assign the ownership of the functions in #{credentials()['name']}; the DB does not define its own functions." if VMC::Cli::Config.trace
|
480
|
+
else
|
481
|
+
fcts = fcts_name.split("\n").collect do |line|
|
482
|
+
line.strip!
|
483
|
+
"'#{line}'"
|
484
|
+
end.join(',')
|
485
|
+
cmd_change_fcts_owner="UPDATE pg_catalog.pg_proc \
|
486
|
+
SET proowner = (SELECT oid FROM pg_roles WHERE rolname = '#{current_owner}')\
|
487
|
+
WHERE pg_proc.proname IN (#{fcts})"
|
488
|
+
puts `sudo -u postgres psql --dbname #{credentials()['name']} -c \"#{cmd_change_fcts_owner}\" #{PSQL_RAW_RES_ARGS}`
|
489
|
+
end
|
476
490
|
end
|
477
491
|
end
|
478
492
|
end
|
@@ -509,7 +523,7 @@ module VMC
|
|
509
523
|
if collection_or_table_names
|
510
524
|
sel_tables = "#{sel_tables} AND table_name LIKE '#{collection_or_table_names}'"
|
511
525
|
end
|
512
|
-
tables = shell(sel_tables)
|
526
|
+
tables = shell(sel_tables, false, true)
|
513
527
|
tables_arr = Array.new
|
514
528
|
tables.split("\n").each do | line |
|
515
529
|
line.strip!
|
data/lib/vmc_knife/vmc_helper.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
require 'json'
|
2
|
+
require 'cli/frameworks'
|
3
|
+
# add java_start our own framework to the array of well known frameworks
|
4
|
+
VMC::Cli::Framework::FRAMEWORKS['JavaGen'] = ['java_start',{ :mem => '512M', :description => 'Java Custom Application'}]
|
5
|
+
|
2
6
|
module VMC
|
3
7
|
module KNIFE
|
4
8
|
module HELPER
|
data/lib/vmc_knife/vmc_knife.rb
CHANGED
@@ -303,7 +303,6 @@ module VMC
|
|
303
303
|
# if we did bind to a database; let's re-assign the ownership of the sql functions
|
304
304
|
# to the favorite app if there is such a thing.
|
305
305
|
if updates && updates['services'] && updates['services']['add']
|
306
|
-
puts "THE ONE WE ARE DEBUGGING #{JSON.pretty_generate updates['services']}"
|
307
306
|
list_services_name=updates['services']['add']
|
308
307
|
list_services_name.each do |cf_service_name|
|
309
308
|
@data_services.each do |data_service|
|
@@ -311,7 +310,6 @@ module VMC
|
|
311
310
|
# is this the privileged app?
|
312
311
|
priv_app_name = data_service.wrapped['director']['bound_app'] if data_service.wrapped['director']
|
313
312
|
if priv_app_name == application.name
|
314
|
-
puts "GOT THE PRIVILEGED APP #{application.name} for the service #{data_service.role_name}"
|
315
313
|
data_service.apply_privileges(priv_app_name)
|
316
314
|
end
|
317
315
|
end
|
@@ -329,14 +327,52 @@ module VMC
|
|
329
327
|
def upload()
|
330
328
|
@applications.each do |application|
|
331
329
|
application_updater = ApplicationManifestApplier.new application, @client
|
332
|
-
application_updater.upload
|
330
|
+
application_updater.upload(@opts[:force])
|
333
331
|
end
|
334
332
|
end
|
333
|
+
def update()
|
334
|
+
@applications.each do |application|
|
335
|
+
application_updater = ApplicationManifestApplier.new application, @client
|
336
|
+
application_updater.update(@opts[:force])
|
337
|
+
end
|
338
|
+
end
|
339
|
+
def patch()
|
340
|
+
@applications.each do |application|
|
341
|
+
application_updater = ApplicationManifestApplier.new application, @client
|
342
|
+
application_updater.patch(@opts[:force])
|
343
|
+
end
|
344
|
+
end
|
345
|
+
def extract_deployed()
|
346
|
+
@applications.each do |application|
|
347
|
+
application_updater = ApplicationManifestApplier.new application, @client
|
348
|
+
application_updater.extract_deployed(@opts[:force])
|
349
|
+
end
|
350
|
+
end
|
351
|
+
def info()
|
352
|
+
configure_only=@opts[:configure_only] || false
|
353
|
+
if configure_only
|
354
|
+
if updates_pending().empty?
|
355
|
+
puts "All configuration up to date: true"
|
356
|
+
return true
|
357
|
+
else
|
358
|
+
puts "All configuration up to data: false"
|
359
|
+
return false
|
360
|
+
end
|
361
|
+
end
|
362
|
+
up_to_date=true
|
363
|
+
@applications.each do |application|
|
364
|
+
application_updater = ApplicationManifestApplier.new application, @client
|
365
|
+
app_up_to_date = application_updater.info()
|
366
|
+
up_to_date = false unless app_up_to_date
|
367
|
+
end
|
368
|
+
puts "All up to date: #{up_to_date}"
|
369
|
+
return up_to_date
|
370
|
+
end
|
335
371
|
def delete()
|
336
372
|
@applications.each do |application|
|
337
373
|
application_updater = ApplicationManifestApplier.new application, @client
|
338
374
|
application_updater.delete
|
339
|
-
end
|
375
|
+
end
|
340
376
|
@data_services.each do |data_service|
|
341
377
|
data_service_updater = DataServiceManifestApplier.new data_service, @client, @current_services, @current_services_info
|
342
378
|
data_service_updater.delete
|
@@ -352,6 +388,57 @@ module VMC
|
|
352
388
|
application_updater.stop
|
353
389
|
end
|
354
390
|
end
|
391
|
+
def running_applications?()
|
392
|
+
if @opts && @opts[:wait]
|
393
|
+
tries = @opts[:wait][:retries]
|
394
|
+
tries = tries.to_i if tries
|
395
|
+
interval = @opts[:wait][:interval]
|
396
|
+
interval = interval.to_i if interval
|
397
|
+
end
|
398
|
+
tries ||= 1
|
399
|
+
interval ||= 30
|
400
|
+
curr_iteration = 0
|
401
|
+
already_running = {}
|
402
|
+
@applications.each do |application|
|
403
|
+
already_running[application.name] = "false"
|
404
|
+
end
|
405
|
+
vmc_apps = Array.new
|
406
|
+
while (curr_iteration <= tries)
|
407
|
+
# brute approach: cmd-line.
|
408
|
+
vmc_apps = ENV['TEST_VMC_APPS_STRING'] # this is for testing.
|
409
|
+
unless vmc_apps
|
410
|
+
vmc_apps = `vmc apps`.strip.split("\n")
|
411
|
+
raise "Unable to run vmc" unless $?.exitstatus == 0
|
412
|
+
end
|
413
|
+
current_healths = Hash.new
|
414
|
+
vmc_apps.each do |line|
|
415
|
+
if line =~ /^\| (\S*)\s*\|\s*\d*\s*\|\s*(\S*)\s*\|/
|
416
|
+
app = $1
|
417
|
+
health = $2
|
418
|
+
current_healths[app] = health
|
419
|
+
end
|
420
|
+
end
|
421
|
+
not_running = Array.new
|
422
|
+
@applications.each do |application|
|
423
|
+
#health = `echo "#{vmc_apps}" | grep \|\ #{application.name}\ | cut -d '|' -f4`
|
424
|
+
health = current_healths[application.name]
|
425
|
+
already_running[application.name] = health
|
426
|
+
not_running << application.name unless health == 'RUNNING'
|
427
|
+
end
|
428
|
+
all_running = not_running.empty?
|
429
|
+
curr_iteration = curr_iteration + 1
|
430
|
+
break if not_running.empty? || curr_iteration == tries
|
431
|
+
p "Sleeping #{interval}s as #{not_running.join(' ')} #{not_running.size == 1 ? 'is' : 'are' } not running yet."
|
432
|
+
sleep(interval)
|
433
|
+
end
|
434
|
+
p "Success: all apps are running" if all_running
|
435
|
+
return true if all_running
|
436
|
+
p "At least one app is not running"
|
437
|
+
vmc_apps.each do |line|
|
438
|
+
p line
|
439
|
+
end
|
440
|
+
return false
|
441
|
+
end
|
355
442
|
def start()
|
356
443
|
@applications.each do |application|
|
357
444
|
application_updater = ApplicationManifestApplier.new application, @client
|
@@ -388,6 +475,7 @@ module VMC
|
|
388
475
|
logs_base_url=man_logs['logs_base_url']
|
389
476
|
# TODO: clean the old files and folders if there are too many of them.
|
390
477
|
end
|
478
|
+
other_logs = man_logs['other_logs']
|
391
479
|
end
|
392
480
|
name_prefix||="cflogs-"
|
393
481
|
parent_output_folder||="/tmp"
|
@@ -417,6 +505,16 @@ module VMC
|
|
417
505
|
FileUtils.cp_r Dir.glob(File.join(vcap_log_folder,"*")), File.join(output_folder, 'vcap')
|
418
506
|
end
|
419
507
|
end
|
508
|
+
if other_logs
|
509
|
+
other_logs_dir=File.join(output_folder, 'other_logs')
|
510
|
+
FileUtils.mkdir other_logs_dir
|
511
|
+
other_logs.each do |name,glob|
|
512
|
+
other_dir=File.join(other_logs_dir, name)
|
513
|
+
FileUtils.mkdir other_dir
|
514
|
+
FileUtils.cp_r Dir.glob(glob), other_dir
|
515
|
+
end
|
516
|
+
end
|
517
|
+
|
420
518
|
curr_dir=Dir.pwd
|
421
519
|
destination=parent_output_folder||curr_dir
|
422
520
|
copy_or_move=("/tmp" == parent_output_folder)?"mv":"cp"
|
@@ -425,7 +523,8 @@ module VMC
|
|
425
523
|
else
|
426
524
|
if logs_base_url
|
427
525
|
hostname=`hostname`.strip
|
428
|
-
|
526
|
+
complete_base_url= logs_base_url =~ /:\/\// ? logs_base_url : "http://#{hostname}.local#{logs_base_url}"
|
527
|
+
puts "Logs available at #{complete_base_url}/#{name} and in #{parent_output_folder}/#{name}"
|
429
528
|
end
|
430
529
|
end
|
431
530
|
`cd #{File.dirname(output_folder)}; zip -r #{output_file} #{File.basename(output_folder)}; #{copy_or_move} #{output_file} #{curr_dir}`
|
@@ -434,6 +533,10 @@ module VMC
|
|
434
533
|
else
|
435
534
|
`mv #{parent_output_folder}/#{output_file} #{parent_output_folder}/#{name}`
|
436
535
|
end
|
536
|
+
if logs_base_url
|
537
|
+
# not the most elegant code to cp then delete:
|
538
|
+
`rm #{output_file}` unless @opts[:output_file]
|
539
|
+
end
|
437
540
|
end
|
438
541
|
end
|
439
542
|
class DataServiceManifestApplier
|
@@ -481,8 +584,11 @@ module VMC
|
|
481
584
|
client.create_service @data_service_json['vendor'], @data_service_json['name']
|
482
585
|
end
|
483
586
|
def delete()
|
484
|
-
|
485
|
-
|
587
|
+
if current().empty?
|
588
|
+
puts "The service #{@data_service_json['name']} does not exist." if VMC::Cli::Config.trace
|
589
|
+
else
|
590
|
+
client.delete_service(@data_service_json['name'])
|
591
|
+
end
|
486
592
|
end
|
487
593
|
|
488
594
|
# Returns the service manifest for the vendor.
|
@@ -565,18 +671,250 @@ module VMC
|
|
565
671
|
end
|
566
672
|
end
|
567
673
|
|
568
|
-
def
|
674
|
+
def version_available()
|
675
|
+
return unless @application_json['repository']
|
676
|
+
if @application_json['repository']['version_available'] && @application_json['repository']['version_available']['url']
|
677
|
+
version_available_url=@application_json['repository']['version_available']['url']
|
678
|
+
url = @application_json['repository']['url']
|
679
|
+
cmd=@application_json['repository']['version_available']['cmd']
|
680
|
+
if version_available_url.start_with?("./")
|
681
|
+
version_available_url.slice!(0)
|
682
|
+
version_available_url.slice!(0)
|
683
|
+
end
|
684
|
+
unless /:\/\// =~ version_available_url || version_available_url.start_with?("/")
|
685
|
+
rel_url=File.dirname(url)
|
686
|
+
version_available_file||=version_available_file
|
687
|
+
version_available_url="#{rel_url}/#{version_available_url}"
|
688
|
+
p "version_available_url: #{version_available_url}" if VMC::Cli::Config.trace
|
689
|
+
p "extract with #{cmd}" if VMC::Cli::Config.trace
|
690
|
+
end
|
691
|
+
## This will find out the available version.
|
692
|
+
`version_built_download=/tmp/version_built_download
|
693
|
+
wget #{wget_args()} --output-document=$version_built_download #{version_available_url} --output-file=/tmp/wget_#{@application_json['name']}_available`
|
694
|
+
available_version=`version_built_download=/tmp/version_built_download;#{cmd}`.strip
|
695
|
+
available_version.gsub(/^["']|["']$/, '')
|
696
|
+
end
|
697
|
+
end
|
698
|
+
|
699
|
+
# returns the internal id of the app in the cloud_controller database
|
700
|
+
def ccdb_app_id()
|
701
|
+
KNIFE::get_app_id(@current_name)
|
702
|
+
end
|
703
|
+
# the sha1 of the staged package
|
704
|
+
def ccdb_staged_hash()
|
705
|
+
ccdb_app_hash('staged_package_hash')
|
706
|
+
end
|
707
|
+
# The sha1 of the package; not staged
|
708
|
+
def ccdb_package_hash()
|
709
|
+
ccdb_app_hash('package_hash')
|
710
|
+
end
|
711
|
+
|
712
|
+
# hash_type: 'staged_package_hash' or 'package_hash'
|
713
|
+
def ccdb_app_hash(hash_type='staged_package_hash')
|
714
|
+
db=KNIFE::get_ccdb_credentials()
|
715
|
+
# todo: add the id of the current vcap user. not a problem unless we have multiple vcap users.
|
716
|
+
app_id = `psql --username #{db['username']} --dbname #{db['database']} -c \"select id from apps where name='#{@current_name}'\" #{PSQL_RAW_RES_ARGS}`.strip
|
717
|
+
unless app_id
|
718
|
+
raise "Can't find the app #{@current_name} amongst the deployed apps in the cloud_controller."
|
719
|
+
end
|
720
|
+
staged_hash=`psql --username #{db['username']} --dbname #{db['database']} -c \"select #{hash_type} from apps where id='#{app_id}'\" #{PSQL_RAW_RES_ARGS}`.strip
|
721
|
+
unless app_id
|
722
|
+
raise "The app #{@current_name} is not staged yet."
|
723
|
+
end
|
724
|
+
staged_hash.strip! if staged_hash
|
725
|
+
staged_hash
|
726
|
+
end
|
727
|
+
|
728
|
+
def version_available_file_path(prefix_app_by_default=true)
|
729
|
+
# extract the file that contains the version from that tar.gz
|
730
|
+
version_available_file=@application_json['repository']['version_installed']['staged_entry'] if @application_json['repository']['version_installed']
|
731
|
+
unless version_available_file
|
732
|
+
# default on the available url prefixed by the 'app' folder
|
733
|
+
if @application_json['repository']['version_available'] && @application_json['repository']['version_available']['url']
|
734
|
+
version_available_url=@application_json['repository']['version_available']['url']
|
735
|
+
if version_available_url.start_with?("./")
|
736
|
+
version_available_url.slice!(0)
|
737
|
+
version_available_url.slice!(0)
|
738
|
+
version_available_file= prefix_app_by_default ? "app/#{version_available_url}" : version_available_url
|
739
|
+
elsif !(/:\/\// =~ version_available_url) && !(version_available_url.start_with?("/"))
|
740
|
+
version_available_file= prefix_app_by_default ? "app/#{version_available_url}" : version_available_url
|
741
|
+
end
|
742
|
+
end
|
743
|
+
else
|
744
|
+
if version_available_file.start_with?('app/') && !prefix_app_by_default
|
745
|
+
version_available_file=version_available_file['app/'.length..-1]
|
746
|
+
elsif version_available_file.start_with?('tomcat/webapp/ROOT/') && !prefix_app_by_default
|
747
|
+
version_available_file=version_available_file['tomcat/webapp/ROOT/'.length..-1]
|
748
|
+
end
|
749
|
+
end
|
750
|
+
version_available_file
|
751
|
+
end
|
752
|
+
|
753
|
+
def cmd_read_version_installed()
|
754
|
+
cmd=@application_json['repository']['version_installed']['cmd'] if @application_json['repository']['version_installed']
|
755
|
+
cmd||=@application_json['repository']['version_available']['cmd'] if @application_json['repository']['version_available']
|
756
|
+
cmd
|
757
|
+
end
|
758
|
+
|
759
|
+
def read_version(droplet_dot_version,cmd)
|
760
|
+
if File.exists? droplet_dot_version
|
761
|
+
installed_version=`version_built_download=#{droplet_dot_version};#{cmd}`.strip
|
762
|
+
raise "could not read the installed version in \
|
763
|
+
#{File.expand_path(version_available_file)} with version_built_download=#{droplet_dot_version};#{cmd}" unless installed_version
|
764
|
+
installed_version.gsub!(/^["']|["']$/, '')
|
765
|
+
puts "#{@current_name} is staged with version installed_version #{installed_version}" if VMC::Cli::Config.trace
|
766
|
+
return installed_version
|
767
|
+
end
|
768
|
+
end
|
769
|
+
|
770
|
+
def droplet_file_path()
|
771
|
+
return unless @application_json['repository']
|
772
|
+
return unless ccdb_app_id()
|
773
|
+
# go into the cloud_controller db, find out the staged_hash
|
774
|
+
staged_hash=ccdb_staged_hash()
|
775
|
+
return unless staged_hash && !staged_hash.empty?
|
776
|
+
droplet="/var/vcap/shared/droplets/#{staged_hash}"
|
777
|
+
raise "Can't find the staged droplet file #{droplet}." unless File.exist?(droplet)
|
778
|
+
return droplet
|
779
|
+
end
|
780
|
+
|
781
|
+
# Reads the version installed
|
782
|
+
def version_installed()
|
783
|
+
droplet=droplet_file_path()
|
784
|
+
return unless droplet
|
785
|
+
version_available_file = version_available_file_path()
|
786
|
+
unless version_available_file
|
787
|
+
puts "Don't know what file stores the version installed of #{@current_name}" if VMC::Cli::Config.trace
|
788
|
+
return
|
789
|
+
end
|
790
|
+
cmd = cmd_read_version_installed()
|
791
|
+
unless cmd
|
792
|
+
puts "Don't know how to read the version installed with a cmd." if VMC::Cli::Config.trace
|
793
|
+
return
|
794
|
+
end
|
795
|
+
puts "Looking for the installed version here #{droplet} // #{version_available_file}" if VMC::Cli::Config.trace
|
796
|
+
puts " with cmd #{cmd}" if VMC::Cli::Config.trace
|
797
|
+
droplet_dot_version="#{droplet}.version"
|
798
|
+
unless File.exists? droplet_dot_version
|
799
|
+
Dir.chdir("/tmp") do
|
800
|
+
`[ -f #{version_available_file} ] && rm #{version_available_file}`
|
801
|
+
`tar -xzf #{droplet} #{version_available_file}`
|
802
|
+
if File.exist?(version_available_file)
|
803
|
+
`cp #{version_available_file} #{droplet_dot_version}`
|
804
|
+
else
|
805
|
+
put "Could not find the installed version file here: here #{droplet} // #{version_available_file}" if VMC::Cli::Config.trace
|
806
|
+
end
|
807
|
+
end
|
808
|
+
end
|
809
|
+
installed_version=read_version(droplet_dot_version,cmd)
|
810
|
+
end
|
811
|
+
|
812
|
+
def info()
|
813
|
+
app_id=ccdb_app_id()
|
814
|
+
if app_id
|
815
|
+
staged_hash=ccdb_staged_hash()||"deployed; not staged"
|
816
|
+
installed_v=version_installed()||"deployed; can't read installed version"
|
817
|
+
else
|
818
|
+
installed_v="not uploaded"
|
819
|
+
staged_hash="not staged"
|
820
|
+
end
|
821
|
+
available_v=version_available()||"none"
|
822
|
+
puts "Application #{@application_json['name']}"
|
823
|
+
puts " Version installed: #{installed_v}; Staged hash: #{staged_hash}"
|
824
|
+
puts " Version available: #{available_v}"
|
825
|
+
return installed_v == available_v if installed_v && available_v
|
826
|
+
return false
|
827
|
+
end
|
828
|
+
|
829
|
+
def wget_args()
|
830
|
+
_wget_args = @application_json['repository']['wget_args']
|
831
|
+
if _wget_args.nil?
|
832
|
+
wget_args_str = ""
|
833
|
+
elsif _wget_args.kind_of? Array
|
834
|
+
wget_args_str = wget_args.join(' ')
|
835
|
+
elsif _wget_args.kind_of? String
|
836
|
+
wget_args_str = wget_args
|
837
|
+
end
|
838
|
+
wget_args_str
|
839
|
+
end
|
840
|
+
|
841
|
+
def update(force=false)
|
842
|
+
raise "The application #{@application_json['name']} does not exist yet" if current().empty?
|
843
|
+
do_delete_download=false
|
844
|
+
begin
|
845
|
+
installed_version=version_installed()
|
846
|
+
p "#{@current_name} installed_version #{installed_version}"
|
847
|
+
available_version=version_available()
|
848
|
+
p "#{@current_name} available_version #{available_version}"
|
849
|
+
if installed_version == available_version
|
850
|
+
puts "The staged version of #{@current_name} is the same than the one on the remote repository"
|
851
|
+
return unless force
|
852
|
+
puts "Forced download"
|
853
|
+
end
|
854
|
+
do_delete_download=true
|
855
|
+
rescue => e
|
856
|
+
p "Trying to read the installed and available version crashed. #{e}"
|
857
|
+
p e.backtrace.join("\n") if VMC::Cli::Config.trace
|
858
|
+
end
|
859
|
+
upload(force,do_delete_download)
|
860
|
+
end
|
861
|
+
|
862
|
+
def app_download_dir_path()
|
863
|
+
"#{ENV['HOME']}/vmc_knife_downloads/#{@application_json['name']}"
|
864
|
+
end
|
865
|
+
def extract_deployed(force=false)
|
866
|
+
installed_v=version_installed()
|
867
|
+
unless installed_v
|
868
|
+
puts "No deployed app #{@application_json['name']}. Not extracting it"
|
869
|
+
return
|
870
|
+
end
|
871
|
+
do_extract=false
|
872
|
+
app_download_dir=app_download_dir_path()
|
873
|
+
if force
|
874
|
+
FileUtils.rm_rf app_download_dir if File.exists?(app_download_dir)
|
875
|
+
do_extract=true
|
876
|
+
elsif File.exists?(app_download_dir)
|
877
|
+
version_file_in_download = File.join(app_download_dir, version_available_file_path(false))
|
878
|
+
p "Reading the version of the downloaded app folder in file #{version_file_in_download}"
|
879
|
+
cmd_to_read=cmd_read_version_installed()
|
880
|
+
version_downloaded=read_version(version_file_in_download,cmd_to_read)
|
881
|
+
if installed_v != version_downloaded
|
882
|
+
p "The version installed is #{installed_v} and the version ready to be deployed is #{version_downloaded}"
|
883
|
+
p "Would you like to replace the app to deploy by the one already deployed?"
|
884
|
+
ans = STDIN.gets.chomp
|
885
|
+
if ans && ans.capitalize.start_with?('Y')
|
886
|
+
FileUtils.rm_rf app_download_dir if File.exists?(app_download_dir)
|
887
|
+
do_extract=true
|
888
|
+
end
|
889
|
+
else
|
890
|
+
p "The version installed and the version ready to deploy are identical: #{installed_v}"
|
891
|
+
end
|
892
|
+
else
|
893
|
+
do_extract = true
|
894
|
+
end
|
895
|
+
if do_extract
|
896
|
+
FileUtils.mkdir_p app_download_dir
|
897
|
+
drop_f_p=droplet_file_path()
|
898
|
+
p "tar -xzvf #{drop_f_p}"
|
899
|
+
`cd /tmp; [ -d drop_app ] && rm -rf drop_app; mkdir drop_app; cd drop_app; tar -xzvf #{drop_f_p}; [ -d app ] && mv app/* #{app_download_dir} || mv tomcat/webapps/ROOT/* #{app_download_dir}`
|
900
|
+
p "Done. ls -la #{app_download_dir}"
|
901
|
+
`ls -la #{app_download_dir}`
|
902
|
+
end
|
903
|
+
end
|
904
|
+
def upload(force=false,do_delete_download=false)
|
569
905
|
raise "The application #{@application_json['name']} does not exist yet" if current().empty?
|
570
906
|
return unless @application_json['repository']
|
571
907
|
url = @application_json['repository']['url']
|
908
|
+
|
572
909
|
Dir.chdir(ENV['HOME']) do
|
573
910
|
tmp_download_filename="_download_.zip"
|
574
|
-
app_download_dir=
|
911
|
+
app_download_dir=app_download_dir_path()
|
912
|
+
`rm -rf #{app_download_dir}` if File.exist?("#{app_download_dir}") && do_delete_download
|
575
913
|
`rm -rf #{app_download_dir}` if File.exist? "#{app_download_dir}/#{tmp_download_filename}"
|
914
|
+
|
576
915
|
FileUtils.mkdir_p app_download_dir
|
577
916
|
Dir.chdir(app_download_dir) do
|
578
|
-
if Dir.entries(Dir.pwd).size == 2
|
579
|
-
#empty directory.
|
917
|
+
if Dir.entries(Dir.pwd).size == 2 #empty directory ?
|
580
918
|
if /\.git$/ =~ url
|
581
919
|
`git clone #{url} --depth 1`
|
582
920
|
branch = @application_json['repository']['branch']
|
@@ -586,17 +924,13 @@ module VMC
|
|
586
924
|
branch='master'
|
587
925
|
end
|
588
926
|
`git pull origin #{branch}`
|
589
|
-
else
|
927
|
+
else
|
590
928
|
begin
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
elsif wget_args.kind_of? String
|
597
|
-
wget_args_str = wget_args
|
598
|
-
end
|
599
|
-
`wget #{wget_args_str} --output-document=#{tmp_download_filename} #{url}`
|
929
|
+
wget_args_str = wget_args()
|
930
|
+
#`wget #{wget_args_str} --output-document=#{tmp_download_filename} #{url}`
|
931
|
+
#TODO: find the same file in the installed apps.
|
932
|
+
`touch /tmp/wget_#{@application_json['name']};\
|
933
|
+
wget #{wget_args_str} --output-document=#{tmp_download_filename} #{url} --output-file=/tmp/wget_#{@application_json['name']}`
|
600
934
|
raise "Unable to download #{url}" unless $? == 0
|
601
935
|
if /\.tgz$/ =~ url || /\.tar\.gz$/ =~ url
|
602
936
|
`tar zxvf #{tmp_download_filename}`
|
@@ -606,34 +940,79 @@ module VMC
|
|
606
940
|
`unzip #{tmp_download_filename}`
|
607
941
|
end
|
608
942
|
ensure
|
609
|
-
`rm #{tmp_download_filename}`
|
943
|
+
`[ -f #{tmp_download_filename} ] && rm #{tmp_download_filename}`
|
610
944
|
end
|
945
|
+
=begin else
|
946
|
+
if /\.git$/ =~ url
|
947
|
+
branch = @application_json['repository']['branch']||"master"
|
948
|
+
`git checkout #{branch}`
|
949
|
+
`git pull origin #{branch}`
|
950
|
+
=end
|
611
951
|
end
|
612
952
|
end
|
613
|
-
|
614
|
-
|
615
|
-
|
953
|
+
post_download_script = @application_json['repository']['post_download_script']
|
954
|
+
if post_download_script
|
955
|
+
curr_dir=Dir.pwd
|
956
|
+
post_download_script = post_download_script.join("\n") if post_download_script.kind_of?(Array)
|
957
|
+
p "Executing the post_download script : #{post_download_script}"
|
958
|
+
success = system(post_download_script)
|
959
|
+
p "Done executing the post_download script succcess #{success}"
|
960
|
+
exit unless success
|
961
|
+
Dir.chdir(curr_dir)
|
962
|
+
end
|
963
|
+
upload_app_bits()
|
616
964
|
end
|
617
965
|
end
|
618
966
|
end
|
619
|
-
|
967
|
+
|
968
|
+
def upload_app_bits()
|
969
|
+
Dir.chdir(app_download_dir_path()) do
|
970
|
+
puts "upload_app_bits in #{app_download_dir_path()}"
|
971
|
+
Dir.chdir(@application_json['repository']['sub_dir']) if @application_json['repository']['sub_dir']
|
972
|
+
tmp_git = "/tmp/#{@application_json['name']}.git"
|
973
|
+
if File.exists? ".git"
|
974
|
+
# don't deploy the .git repo
|
975
|
+
FileUtils.rm_rf(tmp_git) if File.exists?(tmp_git)
|
976
|
+
FileUtils.mv(".git", tmp_git)
|
977
|
+
end
|
978
|
+
begin
|
979
|
+
VMC::KNIFE::HELPER.static_upload_app_bits(@client,@application_json['name'],Dir.pwd)
|
980
|
+
rescue
|
981
|
+
FileUtils.mv(tmp_git, ".git") if File.exists?(tmp_git)
|
982
|
+
end
|
983
|
+
end
|
984
|
+
end
|
985
|
+
|
986
|
+
def patch(force=false)
|
987
|
+
extract_deployed(force)
|
988
|
+
app_download_dir=app_download_dir_path()
|
989
|
+
p "Application ready to be patched in #{app_download_dir}"
|
990
|
+
p "Type y when ready to update. Anything else will stop."
|
991
|
+
ans = STDIN.gets.chomp
|
992
|
+
return unless ans && ans.capitalize.start_with?('Y')
|
993
|
+
upload_app_bits()
|
994
|
+
end
|
995
|
+
|
620
996
|
def start()
|
621
|
-
raise "The application #{@application_json['name']} does not exist yet" if current().empty?
|
622
|
-
return if current[:state] == 'STARTED'
|
997
|
+
#raise "The application #{@application_json['name']} does not exist yet" if current().empty?
|
998
|
+
return if current().empty? || current[:state] == 'STARTED'
|
623
999
|
current[:state] = 'STARTED'
|
624
1000
|
client.update_app(@application_json['name'], current())
|
625
1001
|
end
|
626
1002
|
|
627
1003
|
def stop()
|
628
|
-
raise "The application #{@application_json['name']} does not exist yet" if current().empty?
|
629
|
-
return if current[:state] == 'STOPPED'
|
1004
|
+
#raise "The application #{@application_json['name']} does not exist yet" if current().empty?
|
1005
|
+
return if current().empty? || current[:state] == 'STOPPED'
|
630
1006
|
current[:state] = 'STOPPED'
|
631
1007
|
client.update_app(@application_json['name'], current())
|
632
1008
|
end
|
633
1009
|
|
634
1010
|
def delete()
|
635
|
-
|
636
|
-
|
1011
|
+
if current().empty?
|
1012
|
+
puts "The application #{@application_json['name']} does not exist yet" if VMC::Cli::Config.trace
|
1013
|
+
else
|
1014
|
+
client.delete_app(@application_json['name']) unless current().empty?
|
1015
|
+
end
|
637
1016
|
end
|
638
1017
|
|
639
1018
|
# Generate the updated application manifest:
|
@@ -693,7 +1072,9 @@ module VMC
|
|
693
1072
|
def update_memory_pending()
|
694
1073
|
old_mem = current[:resources][:memory] if current[:resources]
|
695
1074
|
old_mem ||= current['resources']['memory'] if current['resources']
|
1075
|
+
old_mem = old_mem.to_i if old_mem && old_mem.kind_of?(String)
|
696
1076
|
new_mem = @application_json['resources']['memory'] unless @application_json['resources'].nil?
|
1077
|
+
new_mem = new_mem.to_i if new_mem && new_mem.kind_of?(String)
|
697
1078
|
if old_mem != new_mem
|
698
1079
|
return "#{old_mem} => #{new_mem}"
|
699
1080
|
end
|
metadata
CHANGED
@@ -1,151 +1,108 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmc_knife
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.40
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 13
|
10
|
-
version: 0.0.13
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Intalio Pte
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-08-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: vmc
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &28784440 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
18
|
+
requirements:
|
26
19
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
- 3
|
32
|
-
- 14
|
33
|
-
- beta
|
34
|
-
- 4
|
35
|
-
version: 0.3.14.beta4
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.3.18
|
36
22
|
type: :runtime
|
37
|
-
version_requirements: *id001
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: rest-client
|
40
23
|
prerelease: false
|
41
|
-
|
24
|
+
version_requirements: *28784440
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rest-client
|
27
|
+
requirement: &28783860 !ruby/object:Gem::Requirement
|
42
28
|
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
hash: 13
|
47
|
-
segments:
|
48
|
-
- 1
|
49
|
-
- 6
|
50
|
-
- 1
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
51
32
|
version: 1.6.1
|
52
33
|
- - <
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
hash: 11
|
55
|
-
segments:
|
56
|
-
- 1
|
57
|
-
- 7
|
58
|
-
- 0
|
34
|
+
- !ruby/object:Gem::Version
|
59
35
|
version: 1.7.0
|
60
36
|
type: :runtime
|
61
|
-
version_requirements: *id002
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: rspec
|
64
37
|
prerelease: false
|
65
|
-
|
38
|
+
version_requirements: *28783860
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: rspec
|
41
|
+
requirement: &29208120 !ruby/object:Gem::Requirement
|
66
42
|
none: false
|
67
|
-
requirements:
|
43
|
+
requirements:
|
68
44
|
- - ~>
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
hash: 27
|
71
|
-
segments:
|
72
|
-
- 1
|
73
|
-
- 3
|
74
|
-
- 0
|
45
|
+
- !ruby/object:Gem::Version
|
75
46
|
version: 1.3.0
|
76
47
|
type: :development
|
77
|
-
version_requirements: *id003
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: webmock
|
80
48
|
prerelease: false
|
81
|
-
|
49
|
+
version_requirements: *29208120
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: webmock
|
52
|
+
requirement: &29206780 !ruby/object:Gem::Requirement
|
82
53
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
hash: 3
|
87
|
-
segments:
|
88
|
-
- 1
|
89
|
-
- 5
|
90
|
-
- 0
|
54
|
+
requirements:
|
55
|
+
- - =
|
56
|
+
- !ruby/object:Gem::Version
|
91
57
|
version: 1.5.0
|
92
58
|
type: :development
|
93
|
-
|
59
|
+
prerelease: false
|
60
|
+
version_requirements: *29206780
|
94
61
|
description: Extensions for VMC the CLI of VMWare's Cloud Foundry
|
95
62
|
email: hmalphettes@gmail.com
|
96
|
-
executables:
|
63
|
+
executables:
|
97
64
|
- vmc_knife
|
98
65
|
extensions: []
|
99
|
-
|
100
|
-
extra_rdoc_files:
|
66
|
+
extra_rdoc_files:
|
101
67
|
- README.md
|
102
68
|
- LICENSE
|
103
|
-
files:
|
69
|
+
files:
|
104
70
|
- LICENSE
|
105
71
|
- README.md
|
106
72
|
- lib/restclient/restclient_add_timeout.rb
|
107
|
-
- lib/vmc_knife/cli_extensions.rb
|
108
|
-
- lib/vmc_knife/commands/knife_cmds.rb
|
109
|
-
- lib/vmc_knife/data_services.rb
|
110
73
|
- lib/vmc_knife/json_expander.rb
|
74
|
+
- lib/vmc_knife/data_services.rb
|
75
|
+
- lib/vmc_knife/commands/knife_cmds.rb
|
76
|
+
- lib/vmc_knife/vmc_knife.rb
|
77
|
+
- lib/vmc_knife/cli_extensions.rb
|
111
78
|
- lib/vmc_knife/mongo/mongo_cmd.js.erb
|
112
79
|
- lib/vmc_knife/version.rb
|
113
80
|
- lib/vmc_knife/vmc_helper.rb
|
114
|
-
- lib/vmc_knife/vmc_knife.rb
|
115
81
|
- lib/vmc_knife.rb
|
116
|
-
-
|
82
|
+
- !binary |-
|
83
|
+
YmluL3ZtY19rbmlmZQ==
|
117
84
|
homepage: http://intalio.com
|
118
85
|
licenses: []
|
119
|
-
|
120
86
|
post_install_message:
|
121
87
|
rdoc_options: []
|
122
|
-
|
123
|
-
require_paths:
|
88
|
+
require_paths:
|
124
89
|
- lib
|
125
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
126
91
|
none: false
|
127
|
-
requirements:
|
128
|
-
- -
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
|
131
|
-
|
132
|
-
- 0
|
133
|
-
version: "0"
|
134
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ! '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
97
|
none: false
|
136
|
-
requirements:
|
137
|
-
- -
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
|
140
|
-
segments:
|
141
|
-
- 0
|
142
|
-
version: "0"
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
143
102
|
requirements: []
|
144
|
-
|
145
103
|
rubyforge_project:
|
146
|
-
rubygems_version: 1.8.
|
104
|
+
rubygems_version: 1.8.15
|
147
105
|
signing_key:
|
148
106
|
specification_version: 3
|
149
107
|
summary: Extensions for VMC the CLI of VMWare's Cloud Foundry
|
150
108
|
test_files: []
|
151
|
-
|