app42 0.5.5 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +90 -58
- data/lib/app42/base/constants.rb +0 -1
- data/lib/app42/base/help.rb +271 -54
- data/lib/app42/base/message.rb +2 -0
- data/lib/app42/base/shell.rb +9 -1
- data/lib/app42/base/util.rb +97 -6
- data/lib/app42/client/app42_rest_client.rb +0 -8
- data/lib/app42/command/app.rb +47 -34
- data/lib/app42/command/authorize.rb +1 -1
- data/lib/app42/command/base.rb +208 -30
- data/lib/app42/command/client.rb +23 -2
- data/lib/app42/command/config.rb +14 -0
- data/lib/app42/command/info.rb +1 -1
- data/lib/app42/command/service.rb +23 -2
- data/lib/app42/command/setup.rb +89 -0
- data/lib/app42/version.rb +1 -1
- data/spec/app42/base/constants_spec.rb +1 -1
- data/spec/app42/command/app_spec.rb +4 -4
- data/spec/app42/command/info_spec.rb +5 -5
- data/spec/app42/command/service_spec.rb +4 -4
- metadata +2 -2
- data/TODO.txt +0 -36
data/lib/app42/command/base.rb
CHANGED
@@ -33,6 +33,17 @@ module App42
|
|
33
33
|
app_name = get_app_name
|
34
34
|
available = app_url_availability app_name
|
35
35
|
return available if available
|
36
|
+
end
|
37
|
+
|
38
|
+
# collect setup name from user
|
39
|
+
# if setup name will not available
|
40
|
+
# User can try 3 more times with different setup name
|
41
|
+
def get_setup_name_and_check_setup_url_availability
|
42
|
+
@aa_retry ||= 1
|
43
|
+
exit! if (@aa_retry += 1 ) >= 5
|
44
|
+
setup_name = get_setup_name
|
45
|
+
available = setup_url_availability setup_name
|
46
|
+
return available if available
|
36
47
|
end
|
37
48
|
|
38
49
|
# get supported virtual machine type by app42paas
|
@@ -68,6 +79,14 @@ module App42
|
|
68
79
|
valid_app_name ? (return valid_app_name) : get_app_name
|
69
80
|
end
|
70
81
|
|
82
|
+
# Ask setup name from user and
|
83
|
+
# will wait for user response (user will enter setup name)
|
84
|
+
def get_setup_name(prompt = Paint['Enter Setup Name', :cyan])
|
85
|
+
setup_name = ask(prompt) {|q| q.each = true}
|
86
|
+
valid_setup_name = validate_setup_name "Setup name", setup_name.strip
|
87
|
+
valid_setup_name ? (return valid_setup_name) : get_setup_name
|
88
|
+
end
|
89
|
+
|
71
90
|
# get supported runtime by app42paas
|
72
91
|
def get_runtime
|
73
92
|
runtime_hash = {}
|
@@ -142,16 +161,10 @@ module App42
|
|
142
161
|
end
|
143
162
|
|
144
163
|
# get supported vm configuration by app42paas
|
145
|
-
def get_vmconfig
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
vmconfig['vmconfig'].select {|each_vmcf| vmconfig_hash["#{each_vmcf['id']}"] = each_vmcf['memory'] + ' ' + each_vmcf['memoryUnit']}
|
150
|
-
vm_cf = input "Memory Limit", vmconfig_hash.values, true
|
151
|
-
|
152
|
-
vm_cf_id = nil
|
153
|
-
vmconfig_hash.each_pair{|vmcf| vm_cf_id = vmcf[0] if vmcf[1] == vm_cf}
|
154
|
-
return vm_cf_id
|
164
|
+
def get_vmconfig
|
165
|
+
kontena = input "Specify Kontena Power", [], true
|
166
|
+
valid = validate_vm_config kontena
|
167
|
+
valid ? (return valid) : get_vmconfig
|
155
168
|
end
|
156
169
|
|
157
170
|
# collect type of application source supported by app42paas
|
@@ -198,6 +211,25 @@ module App42
|
|
198
211
|
|
199
212
|
end
|
200
213
|
|
214
|
+
# check setup name availabilities
|
215
|
+
def setup_url_availability setup_name
|
216
|
+
query_params = params
|
217
|
+
query_params.store('setupName', setup_name)
|
218
|
+
|
219
|
+
response = with_progress(Paint["Checking Setup Name Availability", :yellow]) do |s|
|
220
|
+
build_get_request query_params, 'setup', 'availability'
|
221
|
+
end
|
222
|
+
|
223
|
+
if response["success"]
|
224
|
+
print_new_line
|
225
|
+
return setup_name
|
226
|
+
else
|
227
|
+
message "#{response['description']}", true, 'red'
|
228
|
+
get_setup_name_and_check_setup_url_availability
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
232
|
+
|
201
233
|
# check service availabilities
|
202
234
|
def service_name_availability service_name
|
203
235
|
query_params = params
|
@@ -217,17 +249,17 @@ module App42
|
|
217
249
|
end
|
218
250
|
|
219
251
|
# infrastructure setup call
|
220
|
-
def create_infrastructure app_name, iaas, vm_type, runtime, framework, webserver, os,
|
252
|
+
def create_infrastructure app_name, iaas, vm_type, runtime, framework, webserver, os, kontena
|
221
253
|
begin
|
222
254
|
body = {'app42' => {"request"=> {
|
223
|
-
"appName"
|
224
|
-
"iaas"
|
225
|
-
"vmType"
|
226
|
-
"runtime"
|
227
|
-
"framework"
|
228
|
-
"webServer"
|
229
|
-
"os"
|
230
|
-
"
|
255
|
+
"appName" => app_name,
|
256
|
+
"iaas" => iaas,
|
257
|
+
"vmType" => vm_type,
|
258
|
+
"runtime" => runtime,
|
259
|
+
"framework" => framework,
|
260
|
+
"webServer" => webserver,
|
261
|
+
"os" => os,
|
262
|
+
"kontenaPower" => kontena
|
231
263
|
}}}.to_json
|
232
264
|
|
233
265
|
query_params = params
|
@@ -259,6 +291,47 @@ module App42
|
|
259
291
|
end
|
260
292
|
end
|
261
293
|
|
294
|
+
# setup cloud API
|
295
|
+
def create_cloud_setup setup_name, iaas, vm_type, setup_type, flavour
|
296
|
+
begin
|
297
|
+
body = {'app42' => {"request"=> {
|
298
|
+
"setupName" => setup_name,
|
299
|
+
"iaas" => iaas,
|
300
|
+
"vmType" => vm_type,
|
301
|
+
"setupType" => setup_type,
|
302
|
+
"flavour" => flavour
|
303
|
+
}}}.to_json
|
304
|
+
|
305
|
+
query_params = params
|
306
|
+
query_params.store('body', body)
|
307
|
+
|
308
|
+
response = with_progress(Paint["Setting up the infrastructure", :yellow]) do |s|
|
309
|
+
build_post_request body, query_params, 'setup', nil
|
310
|
+
end
|
311
|
+
|
312
|
+
if response["success"] == true && response["transactionId"]
|
313
|
+
transaction_success = check_transaction_status_of_setup response["transactionId"], previous_completed = 0, 'created'
|
314
|
+
end
|
315
|
+
|
316
|
+
if transaction_success
|
317
|
+
transaction_params = params
|
318
|
+
transaction_params.store('setupName', setup_name)
|
319
|
+
host_response = build_get_request transaction_params, "setup", "#{setup_name}"
|
320
|
+
end
|
321
|
+
|
322
|
+
if host_response['success']
|
323
|
+
puts Paint["Your setup has been completed successfully, For details, Login you your AppHQ console.", :green]
|
324
|
+
return true
|
325
|
+
else
|
326
|
+
puts Paint["#{response['description']}", :red]
|
327
|
+
end
|
328
|
+
rescue Interrupt
|
329
|
+
puts Paint[" Command cancelled.", :red]
|
330
|
+
exit!
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
|
262
335
|
# Binary upload call
|
263
336
|
def upload_binary app_name, app_source, source_url
|
264
337
|
@code_flag ||= 1
|
@@ -268,21 +341,21 @@ module App42
|
|
268
341
|
query_params.store('appName', app_name)
|
269
342
|
message "#{Message::WAIT_FOR_WHILE}", true, 'green'
|
270
343
|
response = with_progress(Paint["Deploying Application", :yellow]) do |s|
|
271
|
-
@connection.multipart(signature(query_params), resource_url("app", "binary"), query_params, query_params, source_url)
|
344
|
+
@connection.multipart(signature(query_params), resource_url("app/deploy", "binary"), query_params, query_params, source_url)
|
272
345
|
end
|
273
346
|
else
|
274
347
|
body = {'app42' => {"request"=> {
|
275
348
|
"appName" => app_name,
|
276
|
-
"
|
349
|
+
"sourceType" => app_source,
|
277
350
|
"sourceUrl" => source_url,
|
278
351
|
}}}.to_json
|
279
|
-
|
352
|
+
|
280
353
|
query_params = params
|
281
354
|
query_params.store('body', body)
|
282
355
|
|
283
356
|
|
284
357
|
response = with_progress(Paint["Deploying Application", :yellow]) do |s|
|
285
|
-
build_put_request body, query_params, 'app', 'source'
|
358
|
+
build_put_request body, query_params, 'app/deploy', 'source'
|
286
359
|
end
|
287
360
|
end
|
288
361
|
|
@@ -306,6 +379,41 @@ module App42
|
|
306
379
|
return response
|
307
380
|
end
|
308
381
|
|
382
|
+
# Binary update call
|
383
|
+
def update_binary app_name
|
384
|
+
@code_flag ||= 1
|
385
|
+
begin
|
386
|
+
body = {'app42' => {"request"=> {
|
387
|
+
"appName" => app_name
|
388
|
+
}}}.to_json
|
389
|
+
|
390
|
+
query_params = params
|
391
|
+
query_params.store('body', body)
|
392
|
+
|
393
|
+
|
394
|
+
response = with_progress(Paint["Updating Application", :yellow]) do |s|
|
395
|
+
build_put_request body, query_params, 'app/update', 'source'
|
396
|
+
end
|
397
|
+
if response["success"] == true && response["transactionId"]
|
398
|
+
check_transaction_status response["transactionId"], previous_completed = 0, 'Uploaded'
|
399
|
+
end
|
400
|
+
|
401
|
+
if response['success']
|
402
|
+
exit!
|
403
|
+
else
|
404
|
+
puts Paint["#{response['description']}", :red]
|
405
|
+
exit 1 if ( @code_flag += 1 ) > 3
|
406
|
+
get_binary_url app_name
|
407
|
+
end
|
408
|
+
rescue Interrupt
|
409
|
+
puts Paint[" Command cancelled.", :red]
|
410
|
+
exit!
|
411
|
+
rescue Exception => e
|
412
|
+
puts e
|
413
|
+
end
|
414
|
+
return response
|
415
|
+
end
|
416
|
+
|
309
417
|
# It's common methods of app information like app state, info etc.
|
310
418
|
# methods expect +what+ as operation and +app_name+ as Application name
|
311
419
|
def app_information what, app_name
|
@@ -421,14 +529,14 @@ module App42
|
|
421
529
|
# ==== return
|
422
530
|
# will display service details in tabular form and
|
423
531
|
# will exist console
|
424
|
-
def create_service service, service_name ,database, vm_type, iaas,
|
532
|
+
def create_service service, service_name ,database, vm_type, iaas, kontena, os
|
425
533
|
body = {'app42' => {"request"=> {
|
426
|
-
"service"
|
427
|
-
"serviceName"
|
428
|
-
"vmType"
|
429
|
-
"database"
|
430
|
-
"iaas"
|
431
|
-
"
|
534
|
+
"service" => service,
|
535
|
+
"serviceName" => service_name,
|
536
|
+
"vmType" => vm_type,
|
537
|
+
"database" => database,
|
538
|
+
"iaas" => iaas,
|
539
|
+
"kontenaPower" => kontena,
|
432
540
|
"os" => os
|
433
541
|
}}}.to_json
|
434
542
|
|
@@ -498,6 +606,34 @@ module App42
|
|
498
606
|
end
|
499
607
|
end
|
500
608
|
|
609
|
+
# delete setup cloud API, as a
|
610
|
+
#
|
611
|
+
# ==== Parameters
|
612
|
+
# setup_name = setup_name provided by user
|
613
|
+
#
|
614
|
+
# ==== return
|
615
|
+
# true:: if cloud setup deleted
|
616
|
+
# OR
|
617
|
+
# ERROR message in case failed
|
618
|
+
def delete_clouldapi setup_name
|
619
|
+
begin
|
620
|
+
response = with_progress(Paint["Deleting Clould API", :yellow]) do |s|
|
621
|
+
query_params = params
|
622
|
+
query_params.store('setupName', setup_name)
|
623
|
+
build_delete_request query_params, "setup", "#{setup_name}"
|
624
|
+
end
|
625
|
+
|
626
|
+
transaction_success = check_transaction_status response["transactionId"], previous_completed = 0, 'deleted' if response["success"] == true && response["transactionId"]
|
627
|
+
|
628
|
+
response['success'] ? (return true) : (message "#{response['description']}", true, 'red')
|
629
|
+
rescue Interrupt
|
630
|
+
puts Paint[" Command cancelled.", :red]
|
631
|
+
exit!
|
632
|
+
rescue Exception => e
|
633
|
+
puts e
|
634
|
+
end
|
635
|
+
end
|
636
|
+
|
501
637
|
# reset service password and fetch service latest details
|
502
638
|
#
|
503
639
|
# ==== Parameters
|
@@ -542,6 +678,48 @@ module App42
|
|
542
678
|
end
|
543
679
|
end
|
544
680
|
|
681
|
+
|
682
|
+
# All application operation will take placed like app start, stop etc.
|
683
|
+
# expect +what+ as operation and +app_name+ as application name.
|
684
|
+
def service_operation what, service_name
|
685
|
+
begin
|
686
|
+
if what.to_s == 'stop'
|
687
|
+
response = with_progress(Paint[ "Stopping Service #{service_name}", :yellow]) do |s|
|
688
|
+
body = {'app42' => {"request"=> {
|
689
|
+
"serviceName" => service_name
|
690
|
+
}}}.to_json
|
691
|
+
|
692
|
+
query_params = params
|
693
|
+
query_params.store('body', body)
|
694
|
+
build_put_request body, query_params, "service", "#{what}" if what.to_s == 'stop'
|
695
|
+
end
|
696
|
+
else
|
697
|
+
response = with_progress(Paint["#{what.capitalize}ing Service #{service_name}", :yellow]) do |s|
|
698
|
+
body = {'app42' => {"request"=> {
|
699
|
+
"serviceName" => service_name
|
700
|
+
}}}.to_json
|
701
|
+
|
702
|
+
query_params = params
|
703
|
+
query_params.store('body', body)
|
704
|
+
build_put_request body, query_params, "service", "#{what}" if what.to_s == 'restart' || what.to_s == 'start'
|
705
|
+
end
|
706
|
+
end
|
707
|
+
|
708
|
+
if response["success"] == true && response["transactionId"]
|
709
|
+
if what.to_s == 'stop'
|
710
|
+
check_transaction_status response["transactionId"], previous_completed = 0, "#{what}ped"
|
711
|
+
else
|
712
|
+
check_transaction_status response["transactionId"], previous_completed = 0, "#{what}ed"
|
713
|
+
end
|
714
|
+
end
|
715
|
+
|
716
|
+
response['success'] ? (return true) : (message "#{response['description']}", true, 'red')
|
717
|
+
rescue Interrupt
|
718
|
+
puts Paint[" Command cancelled.", :red]
|
719
|
+
exit!
|
720
|
+
end
|
721
|
+
end
|
722
|
+
|
545
723
|
# Bind service to requested source IP and fetch service latest details
|
546
724
|
#
|
547
725
|
# ==== Parameters
|
data/lib/app42/command/client.rb
CHANGED
@@ -127,7 +127,7 @@ module App42
|
|
127
127
|
set_cmd(:app, :setup_infra)
|
128
128
|
|
129
129
|
when 'update'
|
130
|
-
set_cmd(:app, :
|
130
|
+
set_cmd(:app, :update)
|
131
131
|
|
132
132
|
when 'keys'
|
133
133
|
set_cmd(:user, :keys)
|
@@ -201,6 +201,15 @@ module App42
|
|
201
201
|
when 'deleteservice'
|
202
202
|
set_cmd(:service, :delete)
|
203
203
|
|
204
|
+
when 'startservice'
|
205
|
+
set_cmd(:service, :start)
|
206
|
+
|
207
|
+
when 'restartservice'
|
208
|
+
set_cmd(:service, :restart)
|
209
|
+
|
210
|
+
when 'stopservice'
|
211
|
+
set_cmd(:service, :stop)
|
212
|
+
|
204
213
|
when 'resetservicepassword'
|
205
214
|
set_cmd(:service, :reset_pass)
|
206
215
|
|
@@ -211,7 +220,19 @@ module App42
|
|
211
220
|
set_cmd(:service, :service_unbind)
|
212
221
|
|
213
222
|
when 'bindinfo'
|
214
|
-
set_cmd(:service, :service_bindInfo)
|
223
|
+
set_cmd(:service, :service_bindInfo)
|
224
|
+
|
225
|
+
when 'setupcloudapi'
|
226
|
+
set_cmd(:setup, :setup_cloud_api)
|
227
|
+
|
228
|
+
when 'deletecloudapi'
|
229
|
+
set_cmd(:setup, :delete_cloud_api)
|
230
|
+
|
231
|
+
when 'setupinfo'
|
232
|
+
set_cmd(:setup, :info)
|
233
|
+
|
234
|
+
when 'setups'
|
235
|
+
set_cmd(:setup, :setups)
|
215
236
|
|
216
237
|
else
|
217
238
|
puts Paint["app42: Unknown command [#{action}]", :red]
|
data/lib/app42/command/config.rb
CHANGED
@@ -33,6 +33,20 @@ module App42::Command
|
|
33
33
|
build_get_request params, 'info', 'runtimes'
|
34
34
|
end
|
35
35
|
|
36
|
+
#
|
37
|
+
# return list of setup type
|
38
|
+
#
|
39
|
+
def get_setup_type_fm_server
|
40
|
+
build_get_request params, 'info', 'setuptype'
|
41
|
+
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# return list of flavour
|
45
|
+
#
|
46
|
+
def get_flavour_type_fm_server
|
47
|
+
build_get_request params, 'info', 'flavour'
|
48
|
+
end
|
49
|
+
|
36
50
|
#
|
37
51
|
# return list of templates
|
38
52
|
#
|
data/lib/app42/command/info.rb
CHANGED
@@ -83,9 +83,9 @@ module App42::Command
|
|
83
83
|
|
84
84
|
os = get_os_for_service iaas, vm_type, service
|
85
85
|
|
86
|
-
|
86
|
+
kontena = get_vmconfig
|
87
87
|
|
88
|
-
create_service service, service_name , database, vm_type, iaas,
|
88
|
+
create_service service, service_name , database, vm_type, iaas, kontena, os
|
89
89
|
|
90
90
|
end
|
91
91
|
|
@@ -96,6 +96,27 @@ module App42::Command
|
|
96
96
|
exit! if response
|
97
97
|
end
|
98
98
|
|
99
|
+
# collect service name from user and proceed service start request
|
100
|
+
def start
|
101
|
+
@options[:service] = ask_service_name if @options[:service].nil?
|
102
|
+
response = service_operation __method__, @options[:service] if is_service_exist? @options[:service]
|
103
|
+
exit! if response
|
104
|
+
end
|
105
|
+
|
106
|
+
# collect service name from user and proceed service restart request
|
107
|
+
def restart
|
108
|
+
@options[:service] = ask_service_name if @options[:service].nil?
|
109
|
+
response = service_operation __method__, @options[:service] if is_service_exist? @options[:service]
|
110
|
+
exit! if response
|
111
|
+
end
|
112
|
+
|
113
|
+
# collect service name from user and proceed service stop request
|
114
|
+
def stop
|
115
|
+
@options[:service] = ask_service_name if @options[:service].nil?
|
116
|
+
response = service_operation __method__, @options[:service] if is_service_exist? @options[:service]
|
117
|
+
exit! if response
|
118
|
+
end
|
119
|
+
|
99
120
|
# collect service name from user and proceed service resetPassword request
|
100
121
|
def reset_pass
|
101
122
|
@options[:service] = ask_service_name if @options[:service].nil?
|