app42 0.5.3
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 +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,232 @@
|
|
1
|
+
|
2
|
+
require 'paint'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
# A Ruby class to call the App42 REST API.
|
6
|
+
|
7
|
+
module App42
|
8
|
+
module Command
|
9
|
+
class Client
|
10
|
+
|
11
|
+
# read access
|
12
|
+
attr_reader :kclass
|
13
|
+
attr_reader :command
|
14
|
+
attr_reader :args
|
15
|
+
attr_reader :options
|
16
|
+
|
17
|
+
# @return [Object]
|
18
|
+
def initialize(arg = [])
|
19
|
+
@args = args
|
20
|
+
@options = {}
|
21
|
+
@should_exit = true
|
22
|
+
@exception_msg = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
# pre load all commands file
|
26
|
+
def load_command_file
|
27
|
+
Dir[File.join(File.dirname(__FILE__), "*.rb")].each { |file| require file }
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param args
|
31
|
+
# call for require files
|
32
|
+
# Initiate client object
|
33
|
+
def self.app42(*args )
|
34
|
+
begin
|
35
|
+
action = args.shift.strip rescue 'help'
|
36
|
+
App42::Command::Client.new.load_command_file
|
37
|
+
App42::Command::Client.new.start(action, args)
|
38
|
+
rescue Interrupt => e
|
39
|
+
@exception_msg = e.message
|
40
|
+
rescue OptionParser::MissingArgument => e
|
41
|
+
@exception_msg = e.message
|
42
|
+
rescue OptionParser::InvalidOption => e
|
43
|
+
@exception_msg = e.message
|
44
|
+
rescue OptionParser::AmbiguousOption => e
|
45
|
+
@exception_msg = e.message
|
46
|
+
rescue => error
|
47
|
+
@exception_msg = e.message
|
48
|
+
ensure
|
49
|
+
puts Paint["#{@exception_msg}", :red]
|
50
|
+
@should_exit = true if @should_exit.nil?
|
51
|
+
exit @should_exit
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
# Collect all the available options for all commands
|
57
|
+
# Some duplicates exists to capture all scenarios
|
58
|
+
def parse_options(command, args)
|
59
|
+
opts_parser = OptionParser.new do |opts|
|
60
|
+
opts.banner = "\nAvailable options:\n\n"
|
61
|
+
|
62
|
+
opts.on('--api_key API_KEY') { |api| @options[:api] = api }
|
63
|
+
opts.on('--secret_key SECRET_KEY') { |secret| @options[:secret] = secret }
|
64
|
+
opts.on('-a API_KEY') { |api| @options[:api] = api }
|
65
|
+
opts.on('-s SECRET_KEY') { |secret| @options[:secret] = secret }
|
66
|
+
|
67
|
+
opts.on('--app NAME') { |name| @options[:name] = name }
|
68
|
+
opts.on('--name NAME') { |name| @options[:name] = name }
|
69
|
+
|
70
|
+
opts.on('--instance INSTANCE') { |instance| @options[:instance] = instance }
|
71
|
+
opts.on('-i INSTANCE') { |instance| @options[:instance] = instance }
|
72
|
+
|
73
|
+
opts.on('--service SERVICE') { |service| @options[:service] = service }
|
74
|
+
opts.on('-s SERVICE') { |service| @options[:service] = service }
|
75
|
+
|
76
|
+
opts.on('-h', '--help') { puts "#{App42::Base::Help.usage(command)}\n"; exit! }
|
77
|
+
end
|
78
|
+
opts_parser.parse!(args)
|
79
|
+
self
|
80
|
+
end
|
81
|
+
|
82
|
+
# @param [Object] command
|
83
|
+
# @param [Object] args
|
84
|
+
def start(command, args = [])
|
85
|
+
if is_available?(command)
|
86
|
+
parse_options(command, args)
|
87
|
+
execute command
|
88
|
+
cmd = App42::Command.const_get(@kclass.to_s.capitalize)
|
89
|
+
begin
|
90
|
+
cmd.new(@options).send(@command)
|
91
|
+
rescue Interrupt
|
92
|
+
puts Paint[" Command cancelled.", :red]
|
93
|
+
exit!
|
94
|
+
rescue Exception => e
|
95
|
+
puts e
|
96
|
+
end
|
97
|
+
elsif command == 'help'
|
98
|
+
send(command)
|
99
|
+
else
|
100
|
+
puts Paint["app42: Unknown command [#{command}]", :red]
|
101
|
+
App42::Base::Help.how_to
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
# @return true OR false
|
107
|
+
def is_available? command
|
108
|
+
App42::Base::APP42_COMMAND.include?(command)
|
109
|
+
end
|
110
|
+
|
111
|
+
# choose action respective of class
|
112
|
+
def execute command
|
113
|
+
case command
|
114
|
+
when 'version'
|
115
|
+
set_cmd(:config, :version)
|
116
|
+
|
117
|
+
when 'list'
|
118
|
+
set_cmd(:config, :list)
|
119
|
+
|
120
|
+
when 'apps'
|
121
|
+
set_cmd(:app, :apps)
|
122
|
+
|
123
|
+
when 'deploy'
|
124
|
+
set_cmd(:app, :deploy)
|
125
|
+
|
126
|
+
when 'setupInfra'
|
127
|
+
set_cmd(:app, :setup_infra)
|
128
|
+
|
129
|
+
when 'update'
|
130
|
+
set_cmd(:app, :deploy)
|
131
|
+
|
132
|
+
when 'keys'
|
133
|
+
set_cmd(:user, :keys)
|
134
|
+
|
135
|
+
when 'clearKeys'
|
136
|
+
set_cmd(:user, :clear)
|
137
|
+
|
138
|
+
when 'addKeys'
|
139
|
+
set_cmd(:user, :add)
|
140
|
+
|
141
|
+
when 'scale'
|
142
|
+
set_cmd(:app, :scale)
|
143
|
+
|
144
|
+
when 'descale'
|
145
|
+
set_cmd(:app, :descale)
|
146
|
+
|
147
|
+
when 'appState'
|
148
|
+
set_cmd(:info, :state)
|
149
|
+
|
150
|
+
when 'appInfo'
|
151
|
+
set_cmd(:info, :info)
|
152
|
+
|
153
|
+
when 'logs'
|
154
|
+
set_cmd(:info, :logs)
|
155
|
+
|
156
|
+
when 'start'
|
157
|
+
set_cmd(:app, :start)
|
158
|
+
|
159
|
+
when 'stop'
|
160
|
+
set_cmd(:app, :stop)
|
161
|
+
|
162
|
+
when 'restart'
|
163
|
+
set_cmd(:app, :restart)
|
164
|
+
|
165
|
+
when 'deleteInfra'
|
166
|
+
set_cmd(:app, :delete)
|
167
|
+
|
168
|
+
when 'releases'
|
169
|
+
set_cmd(:info, :releases)
|
170
|
+
|
171
|
+
when 'iaasProviders'
|
172
|
+
set_cmd(:config, :iaas_providers)
|
173
|
+
|
174
|
+
when 'frameworks'
|
175
|
+
set_cmd(:config, :frameworks)
|
176
|
+
|
177
|
+
when 'runtimes'
|
178
|
+
set_cmd(:config, :runtimes)
|
179
|
+
|
180
|
+
when 'vmconfigs'
|
181
|
+
set_cmd(:config, :memory)
|
182
|
+
|
183
|
+
when 'app42-update'
|
184
|
+
set_cmd(:config, :update)
|
185
|
+
|
186
|
+
when 'supportedServices'
|
187
|
+
set_cmd(:service, :app42pass_services)
|
188
|
+
|
189
|
+
when 'services'
|
190
|
+
set_cmd(:service, :services)
|
191
|
+
|
192
|
+
when 'serviceInfo'
|
193
|
+
set_cmd(:service, :info)
|
194
|
+
|
195
|
+
when 'createService'
|
196
|
+
set_cmd(:service, :create)
|
197
|
+
|
198
|
+
when 'deleteService'
|
199
|
+
set_cmd(:service, :delete)
|
200
|
+
|
201
|
+
when 'resetServicePassword'
|
202
|
+
set_cmd(:service, :reset_pass)
|
203
|
+
|
204
|
+
when 'bindIP'
|
205
|
+
set_cmd(:service, :service_bind)
|
206
|
+
|
207
|
+
when 'unbindIP'
|
208
|
+
set_cmd(:service, :service_unbind)
|
209
|
+
|
210
|
+
when 'bindInfo'
|
211
|
+
set_cmd(:service, :service_bindInfo)
|
212
|
+
|
213
|
+
else
|
214
|
+
puts Paint["app42: Unknown command [#{action}]", :red]
|
215
|
+
App42::Base::Help.how_to
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
# Set class and respective methods
|
220
|
+
def set_cmd(kclass, command)
|
221
|
+
@kclass = kclass
|
222
|
+
@command = command
|
223
|
+
end
|
224
|
+
|
225
|
+
# invoke help options
|
226
|
+
def help
|
227
|
+
App42::Base::Help.commands
|
228
|
+
end
|
229
|
+
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
module App42::Command
|
2
|
+
class Config < Base
|
3
|
+
|
4
|
+
# This version number is used as the RubyGem release version.
|
5
|
+
def version
|
6
|
+
puts message "App42 current version: #{App42::Version::VERSION::VERSION}", false, 'green'
|
7
|
+
end
|
8
|
+
|
9
|
+
# This will list all app42 available commands.
|
10
|
+
def list
|
11
|
+
message "All app42 available commands", true, 'blue'
|
12
|
+
App42::Base::APP42_COMMAND.select { |action| puts Paint["app42 #{action}", :green]}
|
13
|
+
end
|
14
|
+
|
15
|
+
#
|
16
|
+
# return list of virtual machine type
|
17
|
+
#
|
18
|
+
def get_vm_type
|
19
|
+
build_get_request params, 'info', 'subscription'
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# return list of iaas_providers
|
24
|
+
#
|
25
|
+
def get_iaas_provider
|
26
|
+
build_get_request params, 'info', 'iaasproviders'
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# return list of runtimes
|
31
|
+
#
|
32
|
+
def get_runtimes
|
33
|
+
build_get_request params, 'info', 'runtimes'
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# return list of templates
|
38
|
+
#
|
39
|
+
def get_frameworks iaas, vm_type, rt
|
40
|
+
query_params = params
|
41
|
+
query_params.store('vmType', vm_type)
|
42
|
+
query_params.store('iaas', iaas)
|
43
|
+
query_params.store('runtime', rt)
|
44
|
+
build_get_request query_params, 'info', 'frameworks'
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# return list of web server
|
49
|
+
#
|
50
|
+
def get_webservers iaas, vm_type, rt, framework
|
51
|
+
query_params = params
|
52
|
+
query_params.store('vmType', vm_type)
|
53
|
+
query_params.store('iaas', iaas)
|
54
|
+
query_params.store('runtime', rt)
|
55
|
+
query_params.store('framework', framework)
|
56
|
+
build_get_request query_params, 'info', 'webserver'
|
57
|
+
end
|
58
|
+
|
59
|
+
#
|
60
|
+
# return list of operating system for app
|
61
|
+
#
|
62
|
+
def get_operating_sys_for_app iaas, vm_type, rt, framework, webserver
|
63
|
+
query_params = params
|
64
|
+
query_params.store('vmType', vm_type)
|
65
|
+
query_params.store('iaas', iaas)
|
66
|
+
query_params.store('runtime', rt)
|
67
|
+
query_params.store('framework', framework)
|
68
|
+
query_params.store('webServer', webserver)
|
69
|
+
build_get_request query_params, 'info/app', 'os'
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# return list of operating system for service
|
74
|
+
#
|
75
|
+
def get_operating_sys_for_service iaas, vm_type, service
|
76
|
+
query_params = params
|
77
|
+
query_params.store('vmType', vm_type)
|
78
|
+
query_params.store('iaas', iaas)
|
79
|
+
query_params.store('service', service)
|
80
|
+
build_get_request query_params, 'info/service', 'os'
|
81
|
+
end
|
82
|
+
|
83
|
+
#
|
84
|
+
# return list of vm_configuration(memory)
|
85
|
+
#
|
86
|
+
def get_vmconfig vm_type, iaas
|
87
|
+
query_params = params
|
88
|
+
query_params.store('vmType', vm_type)
|
89
|
+
query_params.store('iaas', iaas)
|
90
|
+
build_get_request query_params, 'info', 'memory'
|
91
|
+
end
|
92
|
+
|
93
|
+
#
|
94
|
+
# return list of iaas_provider
|
95
|
+
#
|
96
|
+
def iaas_providers
|
97
|
+
rows, rows_header_final, rows_header = [], [], nil
|
98
|
+
get_iaas_provider['iaas'].each do |iaas|
|
99
|
+
iaas.delete('id')
|
100
|
+
rows_header = iaas.keys
|
101
|
+
rows << iaas.values
|
102
|
+
end
|
103
|
+
|
104
|
+
rows_header.map { |e| rows_header_final << camel_case_to_whitespace(e) }
|
105
|
+
|
106
|
+
table = Terminal::Table.new :title => Paint["=== Available IaaS Providers ===", :green], :headings => rows_header_final, :rows => rows
|
107
|
+
puts table
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# list app42paas supported frameworks
|
112
|
+
#
|
113
|
+
def frameworks
|
114
|
+
runtime = get_runtime
|
115
|
+
vm_type = get_vm_types
|
116
|
+
iaas = get_iaas_providers
|
117
|
+
framework = get_frameworks iaas, vm_type, runtime
|
118
|
+
rows = []
|
119
|
+
framework['frameworks'].each_pair do |key, value|
|
120
|
+
rows << Array(value.capitalize)
|
121
|
+
end unless framework['frameworks'].nil?
|
122
|
+
|
123
|
+
table = Terminal::Table.new :title => Paint["=== Available Frameworks ===", :green], :rows => rows
|
124
|
+
puts table
|
125
|
+
print_new_line
|
126
|
+
end
|
127
|
+
|
128
|
+
#
|
129
|
+
# list app42paas supported vm_type
|
130
|
+
#
|
131
|
+
def vm_type
|
132
|
+
vm_type = get_config 'config', __method__
|
133
|
+
puts Paint["=== Available virtual machine type ===", :green]
|
134
|
+
vm_type['vm_type'].each do |vt|
|
135
|
+
puts vt.capitalize
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
#
|
140
|
+
# list app42paas supported runtimes
|
141
|
+
#
|
142
|
+
def runtimes
|
143
|
+
rows, rows_header_final, rows_header = [], [], nil
|
144
|
+
|
145
|
+
get_runtimes['runtimes'].each do |rt|
|
146
|
+
rt.delete('id')
|
147
|
+
rows_header = rt.keys
|
148
|
+
rows << rt.values
|
149
|
+
end
|
150
|
+
|
151
|
+
rows_header.map { |e| rows_header_final << camel_case_to_whitespace(e) }
|
152
|
+
|
153
|
+
table = Terminal::Table.new :title => Paint["=== Available Runtimes ===", :green], :headings => rows_header_final, :rows => rows
|
154
|
+
puts table
|
155
|
+
end
|
156
|
+
|
157
|
+
#
|
158
|
+
# list app42paas supported memory
|
159
|
+
#
|
160
|
+
def memory
|
161
|
+
vm_type = get_vm_types
|
162
|
+
iaas = get_iaas_providers
|
163
|
+
vmconfig = get_vmconfig vm_type, iaas
|
164
|
+
rows = []
|
165
|
+
vmconfig['vmconfig'].each_pair do |key, value|
|
166
|
+
rows << Array(value.capitalize)
|
167
|
+
end
|
168
|
+
|
169
|
+
table = Terminal::Table.new :title => Paint["=== Available vmconfigs ===", :green], :rows => rows
|
170
|
+
puts table
|
171
|
+
print_new_line
|
172
|
+
end
|
173
|
+
|
174
|
+
#
|
175
|
+
# update the app42paas client
|
176
|
+
#
|
177
|
+
def update
|
178
|
+
puts 'Uninstalling current app42 client'
|
179
|
+
system('gem uninstall app42')
|
180
|
+
puts "Installing latest app42 client"
|
181
|
+
system ("gem install app42-0.5.0.gem")
|
182
|
+
end
|
183
|
+
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
|
2
|
+
require 'app42/command/user_key'
|
3
|
+
|
4
|
+
module App42
|
5
|
+
module Command
|
6
|
+
class Info < Base
|
7
|
+
|
8
|
+
|
9
|
+
#
|
10
|
+
# show detailed app information
|
11
|
+
#
|
12
|
+
#Examples:
|
13
|
+
#
|
14
|
+
# $ app42 info --app APP
|
15
|
+
# === Demo info
|
16
|
+
# Memory 512
|
17
|
+
# Framework rails
|
18
|
+
# Runtime ruby20
|
19
|
+
# Domain demo.app42paas.com
|
20
|
+
# User jon
|
21
|
+
# Status running
|
22
|
+
#
|
23
|
+
def info
|
24
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
25
|
+
|
26
|
+
rows, rows_header_final, rows_header = [], [], nil
|
27
|
+
app_info = app_information 'app', @options[:name]
|
28
|
+
if app_info && app_info['appInfo']
|
29
|
+
rows_header = app_info['appInfo'].keys
|
30
|
+
rows << app_info['appInfo'].values
|
31
|
+
rows_header.map { |e| rows_header_final << camel_case_to_whitespace(e) }
|
32
|
+
|
33
|
+
table = Terminal::Table.new :title => Paint["=== #{@options[:name]} Info ===", :green], :headings => rows_header_final, :rows => rows
|
34
|
+
puts table
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# show app status information
|
39
|
+
#
|
40
|
+
#Examples:
|
41
|
+
#
|
42
|
+
# $ app42 status --app APP
|
43
|
+
#=== Demo status
|
44
|
+
# running
|
45
|
+
#
|
46
|
+
def state
|
47
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
48
|
+
rows = []
|
49
|
+
rows_header = nil
|
50
|
+
app_status = app_information 'app', @options[:name]
|
51
|
+
rows_header = Array('State')
|
52
|
+
rows << Array(app_status['appInfo']['appStatus'])
|
53
|
+
|
54
|
+
table = Terminal::Table.new :title => Paint["=== #{@options[:name]} State ===", :green], :rows => rows
|
55
|
+
puts table
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns the log URLs for the application
|
59
|
+
def logs
|
60
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
61
|
+
app_logs = app_information 'app/logs', @options[:name] if is_app_exist? @options[:name]
|
62
|
+
rows, rows_header = [], nil
|
63
|
+
rows_header = 'Log URL(s)'
|
64
|
+
app_logs['logUrls'].each do |log|
|
65
|
+
rows << Array(log)
|
66
|
+
end
|
67
|
+
message "#{Message::LOG_MESSAGE}", true, 'green'
|
68
|
+
table = Terminal::Table.new :title => rows_header, :rows => rows
|
69
|
+
puts table
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# list releases
|
74
|
+
#
|
75
|
+
#Examples:
|
76
|
+
#
|
77
|
+
# $ app42 releases --app APP
|
78
|
+
# === Demo releases
|
79
|
+
# Version v1
|
80
|
+
#
|
81
|
+
# Email test@gmail.com
|
82
|
+
#
|
83
|
+
# Date 20/02/2010
|
84
|
+
#
|
85
|
+
#TODO , NEED TO SYNC WITH SERVICE
|
86
|
+
def releases
|
87
|
+
@options[:name] = get_app_name if @options[:name].nil?
|
88
|
+
app_releases = app_information 'releases', @options[:name]
|
89
|
+
puts Paint["=== #{@options[:name]} releases ===", :green]
|
90
|
+
app_releases['releaseInfo'].each do |release|
|
91
|
+
release.each_pair do |key, value|
|
92
|
+
print Paint["#{key.capitalize}", :bright]
|
93
|
+
print Paint[" #{value}\n", :bright]
|
94
|
+
end
|
95
|
+
end if app_releases['releaseInfo']
|
96
|
+
print_new_line
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|