app42 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +119 -0
- data/Rakefile +5 -0
- data/TODO.txt +36 -0
- data/app42.gemspec +41 -0
- data/bin/app42 +15 -0
- data/lib/app42.rb +23 -0
- data/lib/app42/base/constants.rb +33 -0
- data/lib/app42/base/help.rb +717 -0
- data/lib/app42/base/http_helper.rb +46 -0
- data/lib/app42/base/message.rb +35 -0
- data/lib/app42/base/shell.rb +39 -0
- data/lib/app42/base/util.rb +304 -0
- data/lib/app42/client/app42_rest_client.rb +451 -0
- data/lib/app42/client/rest_util.rb +66 -0
- data/lib/app42/command/app.rb +194 -0
- data/lib/app42/command/authorize.rb +29 -0
- data/lib/app42/command/base.rb +660 -0
- data/lib/app42/command/client.rb +232 -0
- data/lib/app42/command/config.rb +185 -0
- data/lib/app42/command/info.rb +101 -0
- data/lib/app42/command/service.rb +196 -0
- data/lib/app42/command/user.rb +140 -0
- data/lib/app42/command/user_key.rb +68 -0
- data/lib/app42/version.rb +13 -0
- data/spec/app42/base/constants_spec.rb +11 -0
- data/spec/app42/command/app_spec.rb +103 -0
- data/spec/app42/command/base_spec.rb +7 -0
- data/spec/app42/command/config_spec.rb +20 -0
- data/spec/app42/command/info_spec.rb +27 -0
- data/spec/app42/command/service_spec.rb +98 -0
- data/spec/app42/command/user_spec.rb +7 -0
- data/spec/app42/command/user_token_spec.rb +40 -0
- data/spec/app42/version_spec.rb +7 -0
- data/spec/app42_spec.rb +2 -0
- data/spec/data/info.yml +16 -0
- data/spec/data/services.yml +25 -0
- data/spec/data/state.yml +16 -0
- data/spec/data/user_services.yml +18 -0
- data/spec/spec_helper.rb +18 -0
- metadata +257 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'cgi'
|
3
|
+
require 'hmac-sha1'
|
4
|
+
|
5
|
+
module App42
|
6
|
+
module Client
|
7
|
+
class RestUtil
|
8
|
+
|
9
|
+
#
|
10
|
+
# Finds the current time
|
11
|
+
#
|
12
|
+
# @return time format
|
13
|
+
#
|
14
|
+
#
|
15
|
+
def get_timestamp_utc
|
16
|
+
timestamp = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%S.%LZ")
|
17
|
+
return timestamp.freeze
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# It signs the request that has to be sent in the Hmac format.
|
22
|
+
#
|
23
|
+
# @param secretKey
|
24
|
+
# @param params
|
25
|
+
#
|
26
|
+
# @rescue InvalidKeyException
|
27
|
+
#
|
28
|
+
def sign secret_key, params
|
29
|
+
sorted_params = sort_convert_table(params)
|
30
|
+
signature = compute_hmac(secret_key, sorted_params)
|
31
|
+
signature
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# This method sorts all the values that are stored in the table.
|
36
|
+
#
|
37
|
+
# @param table
|
38
|
+
# @return sorted string
|
39
|
+
#
|
40
|
+
#
|
41
|
+
def sort_convert_table(table)
|
42
|
+
sorted_params = ""
|
43
|
+
table.sort {|a,b| a[0] <=> b[0]}.each{ |key, val|
|
44
|
+
sorted_params << key
|
45
|
+
sorted_params << val
|
46
|
+
}
|
47
|
+
sorted_params
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Encoding and decoding of the queries are done using the Hmac Algorithm.
|
52
|
+
#
|
53
|
+
# @param baseString
|
54
|
+
# @param key
|
55
|
+
#
|
56
|
+
# @rescue NoSuchAlgorithmException
|
57
|
+
#
|
58
|
+
def compute_hmac(secret_key, sorted_params)
|
59
|
+
signature = Base64.encode64(HMAC::SHA1::digest(secret_key, sorted_params)).strip
|
60
|
+
computed_hmac = CGI.escape(signature)
|
61
|
+
computed_hmac
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
|
2
|
+
require 'fileutils'
|
3
|
+
require 'app42/command/base'
|
4
|
+
require 'terminal-table'
|
5
|
+
|
6
|
+
module App42
|
7
|
+
module Command
|
8
|
+
class App < Base
|
9
|
+
|
10
|
+
# will collect all required attributes for new VM spawn
|
11
|
+
def setup_infra
|
12
|
+
app_name = get_app_name_and_check_app_url_availability
|
13
|
+
vm_type = get_vm_types
|
14
|
+
iaas = get_iaas_providers
|
15
|
+
app_name, source_url = get_app_source app_name, iaas, vm_type
|
16
|
+
end
|
17
|
+
|
18
|
+
# will collect all required attributes for app deploy
|
19
|
+
def deploy
|
20
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
21
|
+
response = interactive_get 'info', 'app/uploadtypes' if is_app_exist? @options[:name]
|
22
|
+
app_source_type = response['sourceTypes']
|
23
|
+
|
24
|
+
if response['sourceTypes'].count > 1
|
25
|
+
# TODO, for future release
|
26
|
+
# get_git_url
|
27
|
+
else
|
28
|
+
status = get_binary_url @options[:name]
|
29
|
+
end
|
30
|
+
exit! if status
|
31
|
+
end
|
32
|
+
|
33
|
+
# @param app_name
|
34
|
+
# @return binary
|
35
|
+
# @return deployment path
|
36
|
+
#
|
37
|
+
def get_binary_url app_name
|
38
|
+
app_source, source_url = collect_app_source app_name
|
39
|
+
status = upload_binary app_name, app_source, source_url
|
40
|
+
return status
|
41
|
+
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# @param app_name
|
45
|
+
# @param iaas
|
46
|
+
# @param vm_type
|
47
|
+
# @return host name
|
48
|
+
#
|
49
|
+
def collect_vm_details app_name, iaas, vm_type
|
50
|
+
runtime = get_runtime
|
51
|
+
framework = get_framework iaas, vm_type, runtime
|
52
|
+
webserver = get_webserver iaas, vm_type, runtime, framework
|
53
|
+
os = get_os_for_app iaas, vm_type, runtime, framework, webserver
|
54
|
+
# FIXME, may be configure out later
|
55
|
+
# instance = get_instance 'new_vm'
|
56
|
+
vmconfig = get_vmconfig vm_type, iaas
|
57
|
+
setup_infra_res = App42::Command::Base.new.create_infrastructure app_name, iaas, vm_type, runtime, framework, webserver, os, vmconfig
|
58
|
+
exit! if setup_infra_res
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# @param deployment path
|
63
|
+
# @param app_name
|
64
|
+
# @return true/SystemExit
|
65
|
+
#
|
66
|
+
def is_binary_exist? source_url, app_name
|
67
|
+
path = escape_path(source_url)
|
68
|
+
app_file_name = nil
|
69
|
+
@binary_retry ||= 1
|
70
|
+
no_of_file = []
|
71
|
+
Dir["#{path}/*"].collect {|f| app_file_name = f and no_of_file << f if f.include?('.zip') || f.include?('.war') || f.include?('.tar.gz') || f.include?('.gzip') }
|
72
|
+
if no_of_file.count > 1
|
73
|
+
message "#{Message::MORE_THAN_ONE_BINARY}", true, 'red'
|
74
|
+
app_file_name = input "Please Select Binary", no_of_file, true
|
75
|
+
elsif app_file_name.nil?
|
76
|
+
message "#{Message::NO_BINARY}", true, 'red'
|
77
|
+
exit! if (@binary_retry +=1 ) >= 4
|
78
|
+
get_binary_url app_name
|
79
|
+
end
|
80
|
+
return app_file_name
|
81
|
+
end
|
82
|
+
|
83
|
+
#
|
84
|
+
# ask existing app url for deploy
|
85
|
+
#
|
86
|
+
def ask_existing_app_url
|
87
|
+
input "Enter App URL", [], true
|
88
|
+
end
|
89
|
+
|
90
|
+
# @param app_source_url
|
91
|
+
def ask_app_source app_source_type
|
92
|
+
input "Choose Source Type", app_source_type, true
|
93
|
+
end
|
94
|
+
|
95
|
+
#
|
96
|
+
# @param binary/git
|
97
|
+
# @return path
|
98
|
+
#
|
99
|
+
def get_source_path app_source
|
100
|
+
path = ask(Paint["#{app_source.capitalize} Deployment Path", :cyan])
|
101
|
+
return path.strip
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
# collect git URL from user
|
106
|
+
#
|
107
|
+
def get_git_url(prompt = Paint["Deployment Path?", :cyan])
|
108
|
+
ask(prompt) {|q| q.each = true}
|
109
|
+
end
|
110
|
+
|
111
|
+
#
|
112
|
+
# Will scale app by no of instance
|
113
|
+
#
|
114
|
+
def scale
|
115
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
116
|
+
instance = get_instance __method__ if is_app_exist? @options[:name]
|
117
|
+
scale_or_descal_res = scale_or_descale_app __method__, instance, @options[:name]
|
118
|
+
exit! if scale_or_descal_res
|
119
|
+
end
|
120
|
+
|
121
|
+
#
|
122
|
+
# Will descale app by no of instance
|
123
|
+
#
|
124
|
+
def descale
|
125
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
126
|
+
instance = get_instance __method__ if is_app_exist? @options[:name]
|
127
|
+
scale_or_descal_res = scale_or_descale_app __method__, instance, @options[:name]
|
128
|
+
exit! if scale_or_descal_res
|
129
|
+
end
|
130
|
+
|
131
|
+
# app42 start
|
132
|
+
#
|
133
|
+
# will start the app, return true or error code/message
|
134
|
+
#
|
135
|
+
def start
|
136
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
137
|
+
app_operation_req = app_operation __method__, @options[:name] if is_app_exist? @options[:name]
|
138
|
+
exit! if app_operation_req
|
139
|
+
end
|
140
|
+
|
141
|
+
# app42 stop
|
142
|
+
#
|
143
|
+
# will stop the app, return true or error code/message
|
144
|
+
#
|
145
|
+
def stop
|
146
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
147
|
+
app_operation_req = app_operation __method__, @options[:name] if is_app_exist? @options[:name]
|
148
|
+
exit! if app_operation_req
|
149
|
+
end
|
150
|
+
|
151
|
+
# app42 start
|
152
|
+
#
|
153
|
+
# will restart the app, return true or error code/message
|
154
|
+
#
|
155
|
+
def restart
|
156
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
157
|
+
app_operation_req = app_operation __method__, @options[:name] if is_app_exist? @options[:name]
|
158
|
+
exit! if app_operation_req
|
159
|
+
end
|
160
|
+
|
161
|
+
#
|
162
|
+
# will delete the app, return true or error code/message
|
163
|
+
#
|
164
|
+
def delete
|
165
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
166
|
+
app_operation_req = app_operation __method__, @options[:name] if is_app_exist? @options[:name]
|
167
|
+
exit! if app_operation_req
|
168
|
+
end
|
169
|
+
|
170
|
+
#
|
171
|
+
# List deployed applications
|
172
|
+
#
|
173
|
+
def apps
|
174
|
+
response = build_get_request params, 'app', nil
|
175
|
+
rows, rows_header_final, rows_header = [], [], nil
|
176
|
+
unless response['apps'].nil?
|
177
|
+
response['apps'].each do |e|
|
178
|
+
rows_header = e.keys
|
179
|
+
rows << e.values
|
180
|
+
end
|
181
|
+
else
|
182
|
+
message "#{Message::NO_APP}", true, 'red'
|
183
|
+
exit!
|
184
|
+
end
|
185
|
+
|
186
|
+
rows_header.map { |e| rows_header_final << camel_case_to_whitespace(e) }
|
187
|
+
|
188
|
+
table = Terminal::Table.new :title => Paint["=== My Apps ===", :green], :headings => rows_header_final, :rows => rows
|
189
|
+
puts table
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
module App42::Command
|
3
|
+
class Auth
|
4
|
+
class << self
|
5
|
+
|
6
|
+
include App42::Command::UserToken
|
7
|
+
include App42::Base::Util
|
8
|
+
|
9
|
+
# @return [TRUE/FALSE]
|
10
|
+
def logged_in?
|
11
|
+
check_key_file?
|
12
|
+
end
|
13
|
+
|
14
|
+
def is_authorize?(api_key, secret_key)
|
15
|
+
if api_key.nil? || secret_key.nil?
|
16
|
+
message "#{Message::ADD_KEY}", true, 'red'
|
17
|
+
puts App42::Base::Help.addKeys
|
18
|
+
exit!
|
19
|
+
elsif api_key.size == 1 || secret_key.size == 1
|
20
|
+
message "#{Message::WRONG_KEY}", true, 'red'
|
21
|
+
puts App42::Base::Help.add
|
22
|
+
exit!
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,660 @@
|
|
1
|
+
|
2
|
+
require 'app42/command/user_key'
|
3
|
+
require "interact/progress"
|
4
|
+
require 'highline'
|
5
|
+
require "interact"
|
6
|
+
|
7
|
+
module App42
|
8
|
+
module Command
|
9
|
+
class Base
|
10
|
+
|
11
|
+
include App42::Command::UserToken
|
12
|
+
include App42::Base::Util
|
13
|
+
include App42::Base::HttpHelper
|
14
|
+
include Interactive
|
15
|
+
include Interact::Progress
|
16
|
+
|
17
|
+
# @return
|
18
|
+
# dup argument to get a non-frozen string
|
19
|
+
def initialize(options={} )
|
20
|
+
@options = options.dup
|
21
|
+
@connection = App42::Client::App42RestClient.new HOST
|
22
|
+
@api_key, @secret_key = get_keys if check_key_file?
|
23
|
+
App42::Command::Auth.is_authorize?(@api_key, @secret_key)
|
24
|
+
@host = HOST
|
25
|
+
end
|
26
|
+
|
27
|
+
# collect application name from user
|
28
|
+
# if application name will not available
|
29
|
+
# User can try 3 more times with different application name
|
30
|
+
def get_app_name_and_check_app_url_availability
|
31
|
+
@aa_retry ||= 1
|
32
|
+
exit! if (@aa_retry += 1 ) >= 5
|
33
|
+
app_name = get_app_name
|
34
|
+
available = app_url_availability app_name
|
35
|
+
return available if available
|
36
|
+
end
|
37
|
+
|
38
|
+
# get supported virtual machine type by app42paas
|
39
|
+
def get_vm_types
|
40
|
+
vm_type = App42::Command::Config.new.get_vm_type
|
41
|
+
vm_type_array = vm_type['deploymentType'].map(&:capitalize)
|
42
|
+
input "Select Virtual Machine Type", vm_type_array, true
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return iaas providers
|
46
|
+
def get_iaas_providers
|
47
|
+
iaas_provider_hash = {}
|
48
|
+
iaas_providers = App42::Command::Config.new.get_iaas_provider
|
49
|
+
|
50
|
+
iaas_providers['iaas'].select {|each_iaas| iaas_provider_hash["#{each_iaas['id']}"] = each_iaas['name'] + ' ' + each_iaas['zone']}
|
51
|
+
iaas = input "Select IaaS Provider", iaas_provider_hash.values, true
|
52
|
+
|
53
|
+
iaas_provider_id = nil
|
54
|
+
iaas_provider_hash.each_pair{|ip| iaas_provider_id = ip[0] if ip[1] == iaas}
|
55
|
+
return iaas_provider_id
|
56
|
+
end
|
57
|
+
|
58
|
+
# collect remaining vm configuration details from user
|
59
|
+
def get_app_source app_name, iaas, vm_type
|
60
|
+
collect_vm_details app_name, iaas, vm_type
|
61
|
+
end
|
62
|
+
|
63
|
+
# Ask application name from user and
|
64
|
+
# will wait for user response (user will enter application name)
|
65
|
+
def get_app_name(prompt = Paint['Application Name', :cyan])
|
66
|
+
app_name = ask(prompt) {|q| q.each = true}
|
67
|
+
valid_app_name = validate_app_and_service_name "App name", app_name.strip
|
68
|
+
valid_app_name ? (return valid_app_name) : get_app_name
|
69
|
+
end
|
70
|
+
|
71
|
+
# get supported runtime by app42paas
|
72
|
+
def get_runtime
|
73
|
+
runtime_hash = {}
|
74
|
+
runtimes = App42::Command::Config.new.get_runtimes
|
75
|
+
|
76
|
+
runtimes['runtimes'].select {|each_rt| runtime_hash["#{each_rt['id']}"] = each_rt['name'] + ' ' + each_rt['version']}
|
77
|
+
rt = input "Select Runtime", runtime_hash.values, true
|
78
|
+
|
79
|
+
rt_id = nil
|
80
|
+
runtime_hash.each_pair{|r| rt_id = r[0] if r[1] == rt}
|
81
|
+
return rt_id
|
82
|
+
end
|
83
|
+
|
84
|
+
# get supported frameworks
|
85
|
+
def get_framework iaas, vm_type, rt
|
86
|
+
framework_hash = {}
|
87
|
+
frameworks = App42::Command::Config.new.get_frameworks iaas, vm_type, rt
|
88
|
+
|
89
|
+
frameworks['frameworks'].select {|each_fw| framework_hash["#{each_fw['id']}"] = each_fw['name'] + ' ' + each_fw['version']}
|
90
|
+
framework = input "Select Framework", framework_hash.values, true
|
91
|
+
|
92
|
+
framework_id = nil
|
93
|
+
framework_hash.each_pair{|f| framework_id = f[0] if f[1] == framework}
|
94
|
+
return framework_id
|
95
|
+
end
|
96
|
+
|
97
|
+
# get supported webserver
|
98
|
+
def get_webserver iaas, vm_type, rt, framework
|
99
|
+
webserver_hash = {}
|
100
|
+
webservers = App42::Command::Config.new.get_webservers( iaas, vm_type, rt, framework)
|
101
|
+
|
102
|
+
webservers['webServer'].select {|each_ws| webserver_hash["#{each_ws['id']}"] = each_ws['name'] + ' ' + each_ws['version']}
|
103
|
+
webserver = input "Select Web Server", webserver_hash.values, true
|
104
|
+
|
105
|
+
webserver_id = nil
|
106
|
+
webserver_hash.each_pair{|ws| webserver_id = ws[0] if ws[1] == webserver}
|
107
|
+
return webserver_id
|
108
|
+
end
|
109
|
+
|
110
|
+
# get supported operating system for app
|
111
|
+
def get_os_for_app iaas, vm_type, rt, framework, webserver
|
112
|
+
os_hash = {}
|
113
|
+
operating_sys = App42::Command::Config.new.get_operating_sys_for_app( iaas, vm_type, rt, framework, webserver)
|
114
|
+
|
115
|
+
if operating_sys['osDetail'].length > 1
|
116
|
+
operating_sys['osDetail'].select {|each_os| os_hash["#{each_os['id']}"] = each_os['name'] + ' ' + each_os['version']}
|
117
|
+
os = input "Select Operating System", os_hash.values, true
|
118
|
+
|
119
|
+
os_id = nil
|
120
|
+
os_hash.each_pair{|o| os_id = o[0] if o[1] == os}
|
121
|
+
return os_id
|
122
|
+
else
|
123
|
+
return operating_sys['osDetail'][0]['id']
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# get supported operating system for service
|
128
|
+
def get_os_for_service iaas, vm_type, service
|
129
|
+
os_hash = {}
|
130
|
+
operating_sys = App42::Command::Config.new.get_operating_sys_for_service( iaas, vm_type, service)
|
131
|
+
|
132
|
+
if operating_sys['osDetail'].length > 1
|
133
|
+
operating_sys['osDetail'].select {|each_os| os_hash["#{each_os['id']}"] = each_os['name'] + ' ' + each_os['version']}
|
134
|
+
os = input "Select Operating System", os_hash.values, true
|
135
|
+
|
136
|
+
os_id = nil
|
137
|
+
os_hash.each_pair{|o| os_id = o[0] if o[1] == os}
|
138
|
+
return os_id
|
139
|
+
else
|
140
|
+
return operating_sys['osDetail'][0]['id']
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# get supported vm configuration by app42paas
|
145
|
+
def get_vmconfig vm_type, iaas
|
146
|
+
vmconfig_hash = {}
|
147
|
+
vmconfig = App42::Command::Config.new.get_vmconfig(vm_type, iaas)
|
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
|
155
|
+
end
|
156
|
+
|
157
|
+
# collect type of application source supported by app42paas
|
158
|
+
def collect_app_source app_name
|
159
|
+
app_source = 'Binary'
|
160
|
+
proceed = ask(
|
161
|
+
Paint["Would you like to deploy from the current directory?", :cyan],
|
162
|
+
:default => true
|
163
|
+
)
|
164
|
+
|
165
|
+
if proceed
|
166
|
+
source_url = Dir.getwd
|
167
|
+
app_file_name = is_binary_exist? source_url, app_name
|
168
|
+
end
|
169
|
+
|
170
|
+
unless proceed
|
171
|
+
source_url = get_source_path app_source
|
172
|
+
if source_url.include?('.zip') || source_url.include?('.war') || source_url.include?('.tar.gz') || source_url.include?('.gzip')
|
173
|
+
return app_source, source_url
|
174
|
+
end
|
175
|
+
app_file_name = is_binary_exist? source_url, app_name
|
176
|
+
end
|
177
|
+
return app_source, app_file_name
|
178
|
+
end
|
179
|
+
|
180
|
+
# private
|
181
|
+
|
182
|
+
# check app availabilities
|
183
|
+
def app_url_availability app_name
|
184
|
+
query_params = params
|
185
|
+
query_params.store('appName', app_name)
|
186
|
+
|
187
|
+
response = with_progress(Paint["\nChecking App Name Availability", :yellow]) do |s|
|
188
|
+
build_get_request query_params, 'app', 'availability'
|
189
|
+
end
|
190
|
+
|
191
|
+
if response["success"]
|
192
|
+
print_new_line
|
193
|
+
return app_name
|
194
|
+
else
|
195
|
+
message "#{response['description']}", true, 'red'
|
196
|
+
get_app_name_and_check_app_url_availability
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
# check service availabilities
|
202
|
+
def service_name_availability service_name
|
203
|
+
query_params = params
|
204
|
+
query_params.store('serviceName', service_name)
|
205
|
+
|
206
|
+
response = with_progress(Paint["Checking Service Name Availability", :yellow]) do |s|
|
207
|
+
build_get_request query_params, 'service', 'availability'
|
208
|
+
end
|
209
|
+
|
210
|
+
if response["success"]
|
211
|
+
print_new_line
|
212
|
+
return service_name
|
213
|
+
else
|
214
|
+
message "#{response['description']}", true, 'red'
|
215
|
+
return nil
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
# infrastructure setup call
|
220
|
+
def create_infrastructure app_name, iaas, vm_type, runtime, framework, webserver, os, vmconfig
|
221
|
+
begin
|
222
|
+
body = {'app42' => {"request"=> {
|
223
|
+
"appName" => app_name,
|
224
|
+
"iaas" => iaas,
|
225
|
+
"vmType" => vm_type,
|
226
|
+
"runtime" => runtime,
|
227
|
+
"framework" => framework,
|
228
|
+
"webServer" => webserver,
|
229
|
+
"os" => os,
|
230
|
+
"vmConfig" => vmconfig
|
231
|
+
}}}.to_json
|
232
|
+
|
233
|
+
query_params = params
|
234
|
+
query_params.store('body', body)
|
235
|
+
|
236
|
+
response = with_progress(Paint["Creating Infrastructure", :yellow]) do |s|
|
237
|
+
build_post_request body, query_params, 'app', nil
|
238
|
+
end
|
239
|
+
|
240
|
+
if response["success"] == true && response["transactionId"]
|
241
|
+
transaction_success = check_transaction_status response["transactionId"], previous_completed = 0, 'created'
|
242
|
+
end
|
243
|
+
|
244
|
+
if transaction_success
|
245
|
+
transaction_params = params
|
246
|
+
transaction_params.store('appName', app_name)
|
247
|
+
host_response = build_get_request transaction_params, "app", "#{app_name}"
|
248
|
+
end
|
249
|
+
|
250
|
+
if host_response['success']
|
251
|
+
puts Paint["Default Application Deployed. URL is: #{host_response['appInfo']['appUrl']}", :green]
|
252
|
+
return true
|
253
|
+
else
|
254
|
+
puts Paint["#{response['description']}", :red]
|
255
|
+
end
|
256
|
+
rescue Interrupt
|
257
|
+
puts Paint[" Command cancelled.", :red]
|
258
|
+
exit!
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
# Binary upload call
|
263
|
+
def upload_binary app_name, app_source, source_url
|
264
|
+
@code_flag ||= 1
|
265
|
+
begin
|
266
|
+
if source_url.include?('.war') || source_url.include?('.zip') || source_url.include?('.tar.gz') || source_url.include?('.gzip')
|
267
|
+
query_params = params
|
268
|
+
query_params.store('appName', app_name)
|
269
|
+
message "#{Message::WAIT_FOR_WHILE}", true, 'green'
|
270
|
+
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)
|
272
|
+
end
|
273
|
+
else
|
274
|
+
body = {'app42' => {"request"=> {
|
275
|
+
"appName" => app_name,
|
276
|
+
"sourcetype" => app_source,
|
277
|
+
"sourceUrl" => source_url,
|
278
|
+
}}}.to_json
|
279
|
+
|
280
|
+
query_params = params
|
281
|
+
query_params.store('body', body)
|
282
|
+
|
283
|
+
|
284
|
+
response = with_progress(Paint["Deploying Application", :yellow]) do |s|
|
285
|
+
build_put_request body, query_params, 'app', 'source'
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
if response["success"] == true && response["transactionId"]
|
290
|
+
check_transaction_status response["transactionId"], previous_completed = 0, 'Uploaded'
|
291
|
+
end
|
292
|
+
|
293
|
+
if response['success']
|
294
|
+
exit!
|
295
|
+
else
|
296
|
+
puts Paint["#{response['description']}", :red]
|
297
|
+
exit 1 if ( @code_flag += 1 ) > 3
|
298
|
+
get_binary_url app_name
|
299
|
+
end
|
300
|
+
rescue Interrupt
|
301
|
+
puts Paint[" Command cancelled.", :red]
|
302
|
+
exit!
|
303
|
+
rescue Exception => e
|
304
|
+
puts e
|
305
|
+
end
|
306
|
+
return response
|
307
|
+
end
|
308
|
+
|
309
|
+
# It's common methods of app information like app state, info etc.
|
310
|
+
# methods expect +what+ as operation and +app_name+ as Application name
|
311
|
+
def app_information what, app_name
|
312
|
+
query_params = params
|
313
|
+
query_params.store('appName', app_name)
|
314
|
+
begin
|
315
|
+
response = build_get_request query_params, "#{what}", "#{app_name}"
|
316
|
+
rescue Exception => e
|
317
|
+
puts e
|
318
|
+
exit!
|
319
|
+
end
|
320
|
+
return response
|
321
|
+
end
|
322
|
+
|
323
|
+
# Scale or descale application by no of instance,
|
324
|
+
# expect +what+ as operation and instance as no of instance
|
325
|
+
def scale_or_descale_app what, instance, app_name
|
326
|
+
begin
|
327
|
+
body = {'app42' => {"request"=> {
|
328
|
+
'appName' => app_name,
|
329
|
+
"instanceCount" => instance
|
330
|
+
}}}.to_json
|
331
|
+
|
332
|
+
query_params = params
|
333
|
+
query_params.store('body', body)
|
334
|
+
|
335
|
+
response = with_progress( Paint[ what.to_s == 'scale' ? "Scaling Application #{app_name} by instance #{instance}" : "Descaling Application #{app_name} by instance #{instance}", :yellow]) do |s|
|
336
|
+
build_post_request body, query_params, "app", what
|
337
|
+
end
|
338
|
+
|
339
|
+
check_transaction_status response["transactionId"], previous_completed = 0, "#{what}d" if response["success"] == true && response["transactionId"]
|
340
|
+
response['success'] ? (return true) : (message "#{response['description']}", true, 'red')
|
341
|
+
|
342
|
+
rescue Interrupt
|
343
|
+
puts Paint[" Command cancelled.", :red]
|
344
|
+
exit!
|
345
|
+
rescue Exception => e
|
346
|
+
puts e
|
347
|
+
exit!
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
# common methods for app42paas config request like runtimes,frameworks etc
|
352
|
+
def interactive_get resource, get_obj
|
353
|
+
begin
|
354
|
+
response = build_get_request params, resource, get_obj
|
355
|
+
rescue Exception => e
|
356
|
+
puts e
|
357
|
+
end
|
358
|
+
return response
|
359
|
+
end
|
360
|
+
|
361
|
+
# All application operation will take placed like app start, stop etc.
|
362
|
+
# expect +what+ as operation and +app_name+ as application name.
|
363
|
+
def app_operation what, app_name
|
364
|
+
begin
|
365
|
+
if what.to_s == 'stop'
|
366
|
+
response = with_progress(Paint[ "Stopping Application #{app_name}", :yellow]) do |s|
|
367
|
+
body = {'app42' => {"request"=> {
|
368
|
+
"appName" => app_name
|
369
|
+
}}}.to_json
|
370
|
+
|
371
|
+
query_params = params
|
372
|
+
query_params.store('body', body)
|
373
|
+
build_put_request body, query_params, "app", "#{what}" if what.to_s == 'restart' || what.to_s == 'stop' || what.to_s == 'start'
|
374
|
+
end
|
375
|
+
else
|
376
|
+
response = with_progress(Paint[ what.to_s == 'delete' ? "Deleting Application #{app_name}" : "#{what.capitalize}ing Application #{app_name}", :yellow]) do |s|
|
377
|
+
if what.to_s == 'delete'
|
378
|
+
query_params = params
|
379
|
+
query_params.store('appName', app_name)
|
380
|
+
build_delete_request query_params, "app", "#{app_name}"
|
381
|
+
else
|
382
|
+
body = {'app42' => {"request"=> {
|
383
|
+
"appName" => app_name
|
384
|
+
}}}.to_json
|
385
|
+
|
386
|
+
query_params = params
|
387
|
+
query_params.store('body', body)
|
388
|
+
build_put_request body, query_params, "app", "#{what}" if what.to_s == 'restart' || what.to_s == 'stop' || what.to_s == 'start'
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
if response["success"] == true && response["transactionId"]
|
394
|
+
if what.to_s == 'delete'
|
395
|
+
check_transaction_status response["transactionId"], previous_completed = 0, "#{what}d"
|
396
|
+
elsif what.to_s == 'stop'
|
397
|
+
check_transaction_status response["transactionId"], previous_completed = 0, "#{what}ped"
|
398
|
+
else
|
399
|
+
check_transaction_status response["transactionId"], previous_completed = 0, "#{what}ed"
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
response['success'] ? (return true) : (message "#{response['description']}", true, 'red')
|
404
|
+
rescue Interrupt
|
405
|
+
puts Paint[" Command cancelled.", :red]
|
406
|
+
exit!
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
# create service and get all relevant service information post service creation.
|
411
|
+
#
|
412
|
+
# ==== Parameters
|
413
|
+
# service = type of service mysql,mongodb etc
|
414
|
+
# service_name = service name provided by user
|
415
|
+
# database = database name provided by user
|
416
|
+
# vm_type = shared OR dedicated
|
417
|
+
# iaas = zone where user want to create service
|
418
|
+
# vmconfig = virtual machine configuration details
|
419
|
+
# os = ubuntu OR Window
|
420
|
+
#
|
421
|
+
# ==== return
|
422
|
+
# will display service details in tabular form and
|
423
|
+
# will exist console
|
424
|
+
def create_service service, service_name ,database, vm_type, iaas, vmconfig, os
|
425
|
+
body = {'app42' => {"request"=> {
|
426
|
+
"service" => service,
|
427
|
+
"serviceName" => service_name,
|
428
|
+
"vmType" => vm_type,
|
429
|
+
"database" => database,
|
430
|
+
"iaas" => iaas,
|
431
|
+
"vmconfig" => vmconfig,
|
432
|
+
"os" => os
|
433
|
+
}}}.to_json
|
434
|
+
|
435
|
+
query_params = params
|
436
|
+
query_params.store('body', body)
|
437
|
+
|
438
|
+
begin
|
439
|
+
response = with_progress(Paint["Creating Service", :yellow]) do |s|
|
440
|
+
build_post_request body, query_params, 'service', nil
|
441
|
+
end
|
442
|
+
rescue Interrupt
|
443
|
+
puts Paint[" Command cancelled.", :red]
|
444
|
+
exit!
|
445
|
+
end
|
446
|
+
|
447
|
+
|
448
|
+
if response["success"] == true && response["transactionId"]
|
449
|
+
transaction_response = check_transaction_status response["transactionId"], previous_completed = 0, 'created'
|
450
|
+
end
|
451
|
+
|
452
|
+
if transaction_response
|
453
|
+
service_info_params = params
|
454
|
+
service_info_params.store('serviceName', service_name)
|
455
|
+
service_details = build_get_request service_info_params, "service", "#{service_name}"
|
456
|
+
end
|
457
|
+
|
458
|
+
if service_details['success']
|
459
|
+
rows, rows_header_final, rows_header = [], [], nil
|
460
|
+
|
461
|
+
rows_header = service_details['service'].keys
|
462
|
+
rows << service_details['service'].values
|
463
|
+
|
464
|
+
rows_header.map { |e| rows_header_final << camel_case_to_whitespace(e) }
|
465
|
+
|
466
|
+
table = Terminal::Table.new :title => Paint["=== #{service_name} Details ===", :green], :headings => rows_header_final, :rows => rows
|
467
|
+
puts table
|
468
|
+
else
|
469
|
+
puts Paint["#{response['description']}", :red]
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
473
|
+
# delete service, as a
|
474
|
+
#
|
475
|
+
# ==== Parameters
|
476
|
+
# service_name = service name provided by user
|
477
|
+
#
|
478
|
+
# ==== return
|
479
|
+
# true:: if service deleted
|
480
|
+
# OR
|
481
|
+
# ERROR message in case failed
|
482
|
+
def delete_service service_name
|
483
|
+
begin
|
484
|
+
response = with_progress(Paint["Deleting Service", :yellow]) do |s|
|
485
|
+
query_params = params
|
486
|
+
query_params.store('serviceName', service_name)
|
487
|
+
build_delete_request query_params, "service", "#{service_name}"
|
488
|
+
end
|
489
|
+
|
490
|
+
transaction_success = check_transaction_status response["transactionId"], previous_completed = 0, 'deleted' if response["success"] == true && response["transactionId"]
|
491
|
+
|
492
|
+
response['success'] ? (return true) : (message "#{response['description']}", true, 'red')
|
493
|
+
rescue Interrupt
|
494
|
+
puts Paint[" Command cancelled.", :red]
|
495
|
+
exit!
|
496
|
+
rescue Exception => e
|
497
|
+
puts e
|
498
|
+
end
|
499
|
+
end
|
500
|
+
|
501
|
+
# reset service password and fetch service latest details
|
502
|
+
#
|
503
|
+
# ==== Parameters
|
504
|
+
# service_name = service name provided by user
|
505
|
+
# old_password = service old password
|
506
|
+
#
|
507
|
+
# ==== return
|
508
|
+
# true:: if reset password successful
|
509
|
+
# OR
|
510
|
+
# ERROR message in case failed
|
511
|
+
def reset_password service_name, old_password
|
512
|
+
begin
|
513
|
+
body = {'app42' => {"request"=> {
|
514
|
+
"serviceName" => service_name,
|
515
|
+
"password" => old_password
|
516
|
+
}}}.to_json
|
517
|
+
|
518
|
+
query_params = params
|
519
|
+
query_params.store('body', body)
|
520
|
+
|
521
|
+
response = with_progress(Paint["Resetting Password", :yellow]) do |s|
|
522
|
+
build_put_request body, query_params, 'service', "password"
|
523
|
+
end
|
524
|
+
|
525
|
+
if response["success"] == true && response["transactionId"]
|
526
|
+
transaction_response = check_transaction_status response["transactionId"], previous_completed = 0, 'created'
|
527
|
+
end
|
528
|
+
|
529
|
+
if transaction_response
|
530
|
+
service_info_params = params
|
531
|
+
service_info_params.store('serviceName', service_name)
|
532
|
+
service_details = build_get_request service_info_params, "service", "#{service_name}"
|
533
|
+
end
|
534
|
+
|
535
|
+
service_details['success'] ? (return service_details) : (message "#{response['description']}", true , 'red')
|
536
|
+
|
537
|
+
rescue Interrupt
|
538
|
+
puts Paint[" Command cancelled.", :red]
|
539
|
+
exit!
|
540
|
+
rescue Exception => e
|
541
|
+
puts e
|
542
|
+
end
|
543
|
+
end
|
544
|
+
|
545
|
+
# Bind service to requested source IP and fetch service latest details
|
546
|
+
#
|
547
|
+
# ==== Parameters
|
548
|
+
# service_name = service name provided by user
|
549
|
+
# source_ip = source IP to which service will get bind
|
550
|
+
# access_time = time duration user want to bind IP to service
|
551
|
+
#
|
552
|
+
# ==== return
|
553
|
+
# display service bind details in tabular form
|
554
|
+
# OR
|
555
|
+
# ERROR message in case failed
|
556
|
+
def create_service_tunnel service_name, source_ip
|
557
|
+
begin
|
558
|
+
body = {'app42' => {"request"=> {
|
559
|
+
"serviceName" => service_name,
|
560
|
+
"sourceIp" => source_ip
|
561
|
+
}}}.to_json
|
562
|
+
|
563
|
+
query_params = params
|
564
|
+
query_params.store('body', body)
|
565
|
+
|
566
|
+
response = with_progress(Paint["Binding IP to service", :yellow]) do |s|
|
567
|
+
build_put_request body, query_params, 'service', "bind"
|
568
|
+
end
|
569
|
+
|
570
|
+
if response["success"] == true && response["transactionId"]
|
571
|
+
transaction_response = check_transaction_status response["transactionId"], previous_completed = 0, 'created'
|
572
|
+
end
|
573
|
+
|
574
|
+
if transaction_response
|
575
|
+
service_info_params = params
|
576
|
+
service_info_params.store('serviceName', service_name)
|
577
|
+
service_tunnel_details = build_get_request service_info_params, "service", "tunnel/#{service_name}"
|
578
|
+
end
|
579
|
+
|
580
|
+
if service_tunnel_details['success']
|
581
|
+
rows, rows_header_final, rows_header = [], [], nil
|
582
|
+
|
583
|
+
rows_header = service_tunnel_details['service'].keys
|
584
|
+
rows << service_tunnel_details['service'].values
|
585
|
+
|
586
|
+
rows_header.map { |e| rows_header_final << camel_case_to_whitespace(e) }
|
587
|
+
|
588
|
+
table = Terminal::Table.new :title => Paint["=== #{service_name} Details ===", :green], :headings => rows_header_final, :rows => rows
|
589
|
+
puts table
|
590
|
+
|
591
|
+
else
|
592
|
+
puts Paint["#{response['description']}", :red]
|
593
|
+
end
|
594
|
+
rescue Interrupt
|
595
|
+
puts Paint[" Command cancelled.", :red]
|
596
|
+
exit!
|
597
|
+
rescue Exception => e
|
598
|
+
puts e
|
599
|
+
end
|
600
|
+
end
|
601
|
+
|
602
|
+
# Unbind service to requested source IP
|
603
|
+
#
|
604
|
+
# ==== Parameters
|
605
|
+
# service_name = service name provided by user
|
606
|
+
# source_ip = source IP to which service will get bind
|
607
|
+
#
|
608
|
+
# ==== return
|
609
|
+
# display service bind details in tabular form
|
610
|
+
# OR
|
611
|
+
# ERROR message in case failed
|
612
|
+
def delete_service_tunnel service_name, source_ip
|
613
|
+
begin
|
614
|
+
body = {'app42' => {"request"=> {
|
615
|
+
"serviceName" => service_name,
|
616
|
+
"sourceIp" => source_ip
|
617
|
+
}}}.to_json
|
618
|
+
|
619
|
+
query_params = params
|
620
|
+
query_params.store('body', body)
|
621
|
+
|
622
|
+
response = with_progress(Paint["Unbinding IP to service", :yellow]) do |s|
|
623
|
+
build_put_request body, query_params, 'service', "unbind"
|
624
|
+
end
|
625
|
+
|
626
|
+
if response["success"] == true && response["transactionId"]
|
627
|
+
transaction_response = check_transaction_status response["transactionId"], previous_completed = 0, 'created'
|
628
|
+
return true
|
629
|
+
end
|
630
|
+
rescue Interrupt
|
631
|
+
puts Paint[" Command cancelled.", :red]
|
632
|
+
exit!
|
633
|
+
rescue Exception => e
|
634
|
+
puts e
|
635
|
+
end
|
636
|
+
end
|
637
|
+
|
638
|
+
#
|
639
|
+
# return no of instance
|
640
|
+
#
|
641
|
+
def get_instance obj
|
642
|
+
instance = @options[:instance] if @options[:instance]
|
643
|
+
unless instance
|
644
|
+
instance = nil
|
645
|
+
instance = ask Paint[ obj == 'new_vm' ? "No of instances you want?" : "#{obj.capitalize} by instance(s)", :cyan]
|
646
|
+
|
647
|
+
end
|
648
|
+
|
649
|
+
instance_count = number_valid? instance
|
650
|
+
|
651
|
+
if instance_count
|
652
|
+
return instance_count
|
653
|
+
else
|
654
|
+
message "#{Message::NOT_A_VALID_NUM}", true, 'red'
|
655
|
+
get_instance obj
|
656
|
+
end
|
657
|
+
end
|
658
|
+
end
|
659
|
+
end
|
660
|
+
end
|