pi 0.1.19 → 0.1.20
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.
- data/README +50 -25
- data/lib/cli.rb +5 -0
- data/lib/cli/choose_helper.rb +50 -0
- data/lib/cli/commands/admin.rb +19 -0
- data/lib/cli/commands/apps.rb +566 -0
- data/lib/cli/commands/base.rb +2 -2
- data/lib/cli/commands/dns.rb +120 -0
- data/lib/cli/commands/projects.rb +85 -102
- data/lib/cli/commands/services.rb +134 -0
- data/lib/cli/commands/user.rb +14 -19
- data/lib/cli/runner.rb +112 -4
- data/lib/cli/usage.rb +24 -0
- data/lib/cli/version.rb +1 -1
- data/lib/pi/client.rb +151 -6
- data/lib/pi/const.rb +2 -0
- metadata +42 -21
data/lib/cli/commands/user.rb
CHANGED
@@ -3,26 +3,21 @@ require 'set'
|
|
3
3
|
module PI::Cli::Command
|
4
4
|
|
5
5
|
class User < Base
|
6
|
-
|
7
|
-
YES_SET = Set.new(["y", "Y", "yes", "YES"])
|
8
6
|
|
9
7
|
def login(url=nil)
|
10
8
|
unless url
|
11
|
-
url = ask
|
12
|
-
if
|
9
|
+
url = ask "Attempting login to '#{target_url}'?", :default => true
|
10
|
+
if url == true
|
13
11
|
url = "#{target_url}"
|
14
|
-
else
|
15
|
-
url =
|
16
|
-
else
|
17
|
-
url = ask("URL: ")
|
18
|
-
end
|
12
|
+
else
|
13
|
+
url = ask "Please input URL"
|
19
14
|
end
|
20
|
-
end
|
15
|
+
end
|
21
16
|
url = "#{target_url}" if url.nil? || url.empty?
|
22
|
-
eval("PI::Cli::Command::Misc").new().send("set_target", url)
|
17
|
+
eval("PI::Cli::Command::Misc").new().send("set_target", url)
|
23
18
|
tries ||= 0
|
24
|
-
user = ask
|
25
|
-
password = ask
|
19
|
+
user = ask "User"
|
20
|
+
password = ask "Password", :echo => '*'
|
26
21
|
err "Need a valid user" unless user
|
27
22
|
err "Need a password" unless password
|
28
23
|
login_and_save_token(user, password)
|
@@ -41,7 +36,7 @@ module PI::Cli::Command
|
|
41
36
|
say "Successfully logged out of [#{target_url}]".green
|
42
37
|
end
|
43
38
|
|
44
|
-
def info
|
39
|
+
def info
|
45
40
|
info = client.info
|
46
41
|
return display JSON.pretty_generate(info) if @options[:json]
|
47
42
|
display "\nName: #{info[:name]}"
|
@@ -83,8 +78,8 @@ module PI::Cli::Command
|
|
83
78
|
def password(newpassword=nil)
|
84
79
|
unless newpassword
|
85
80
|
loop{
|
86
|
-
newpassword = ask
|
87
|
-
newpassword2 = ask
|
81
|
+
newpassword = ask "New Password", :echo => '*'
|
82
|
+
newpassword2 = ask "Verify Password", :echo => '*'
|
88
83
|
if newpassword != newpassword2
|
89
84
|
display "Passwords did not match, try again"
|
90
85
|
newpassword =nil
|
@@ -99,9 +94,9 @@ module PI::Cli::Command
|
|
99
94
|
end
|
100
95
|
|
101
96
|
def github(name=nil)
|
102
|
-
name = ask
|
103
|
-
email = ask
|
104
|
-
password = ask
|
97
|
+
name = ask "Please input your name" unless name
|
98
|
+
email = ask "Please input your email"
|
99
|
+
password = ask "Please input your password", :echo => '*'
|
105
100
|
manifest = {
|
106
101
|
:name => "#{name}",
|
107
102
|
:password => "#{password}",
|
data/lib/cli/runner.rb
CHANGED
@@ -74,7 +74,9 @@ class PI::Cli::Runner
|
|
74
74
|
def parse_command!
|
75
75
|
# just return if already set, happends with -v, -h
|
76
76
|
return if @namespace && @action
|
77
|
-
|
77
|
+
|
78
|
+
# @help_only = false
|
79
|
+
|
78
80
|
verb = @args.shift
|
79
81
|
case verb
|
80
82
|
|
@@ -123,9 +125,17 @@ class PI::Cli::Runner
|
|
123
125
|
set_cmd(:misc, :version)
|
124
126
|
|
125
127
|
when 'help'
|
126
|
-
|
127
|
-
|
128
|
-
|
128
|
+
if @args.size == 0
|
129
|
+
display_help
|
130
|
+
break
|
131
|
+
else if @args == ["help"] && @args.size == 1
|
132
|
+
usage('pi help [command]')
|
133
|
+
else
|
134
|
+
@help_only = true
|
135
|
+
parse_command!
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
129
139
|
|
130
140
|
when 'options'
|
131
141
|
@args = @args.unshift('--options')
|
@@ -167,6 +177,104 @@ class PI::Cli::Runner
|
|
167
177
|
usage('pi project-apps [projectname]')
|
168
178
|
set_cmd(:projects, :project_apps, @args.size == 1 ? 1 : 0)
|
169
179
|
|
180
|
+
###############################################################################
|
181
|
+
# Applications
|
182
|
+
###############################################################################
|
183
|
+
|
184
|
+
when 'apps'
|
185
|
+
usage('pi apps [projectid]')
|
186
|
+
set_cmd(:apps, :apps, @args.size == 1 ? 1 : 0)
|
187
|
+
|
188
|
+
when 'create-app'
|
189
|
+
usage('pi create-app [appname]')
|
190
|
+
set_cmd(:apps, :create_app, @args.size == 1 ? 1 : 0)
|
191
|
+
|
192
|
+
when 'delete-app'
|
193
|
+
usage('pi delete-app [appid]')
|
194
|
+
set_cmd(:apps, :delete_app, @args.size == 1 ? 1 : 0)
|
195
|
+
|
196
|
+
when 'start-app'
|
197
|
+
usage('pi start-app [appid]')
|
198
|
+
set_cmd(:apps, :start_app, @args.size == 1 ? 1 : 0)
|
199
|
+
|
200
|
+
when 'stop-app'
|
201
|
+
usage('pi stop-app [appid]')
|
202
|
+
set_cmd(:apps, :stop_app, @args.size == 1 ? 1 : 0)
|
203
|
+
|
204
|
+
when 'restart-app'
|
205
|
+
usage('pi restart-app [appid]')
|
206
|
+
set_cmd(:apps, :restart_app, @args.size == 1 ? 1 : 0)
|
207
|
+
|
208
|
+
when 'scale-app'
|
209
|
+
usage('pi scale-app [appid]')
|
210
|
+
set_cmd(:apps, :scale_app, @args.size == 1 ? 1 : 0)
|
211
|
+
|
212
|
+
when 'update-app'
|
213
|
+
usage('pi update-app [appid]')
|
214
|
+
set_cmd(:apps, :update_app, @args.size == 1 ? 1 : 0)
|
215
|
+
|
216
|
+
when 'status'
|
217
|
+
usage('pi status [appname]')
|
218
|
+
set_cmd(:apps, :status, @args.size == 1 ? 1 : 0)
|
219
|
+
|
220
|
+
when 'app-env'
|
221
|
+
usage('pi app-env [appname]')
|
222
|
+
set_cmd(:apps, :app_env, @args.size == 1 ? 1 : 0)
|
223
|
+
|
224
|
+
when 'create-env'
|
225
|
+
usage('pi create-env [appname]')
|
226
|
+
set_cmd(:apps, :create_env, @args.size == 1 ? 1 : 0)
|
227
|
+
|
228
|
+
when 'delete-env'
|
229
|
+
usage('pi delete-env [appname]')
|
230
|
+
set_cmd(:apps, :delete_env, @args.size == 1 ? 1 : 0)
|
231
|
+
|
232
|
+
when 'app-log'
|
233
|
+
usage('pi app-log [appid]')
|
234
|
+
set_cmd(:apps, :app_log, @args.size == 1 ? 1 : 0)
|
235
|
+
|
236
|
+
###############################################################################
|
237
|
+
# Services
|
238
|
+
###############################################################################
|
239
|
+
|
240
|
+
when 'app-service'
|
241
|
+
usage('pi app-service [appname]')
|
242
|
+
set_cmd(:services, :app_service, @args.size == 1 ? 1 : 0)
|
243
|
+
|
244
|
+
when 'bind-service'
|
245
|
+
usage('pi bind-service [appname]')
|
246
|
+
set_cmd(:services, :bind_service, @args.size == 1 ? 1 : 0)
|
247
|
+
|
248
|
+
when 'unbind-service'
|
249
|
+
usage('pi unbind-service [appname]')
|
250
|
+
set_cmd(:services, :unbind_service, @args.size == 1 ? 1 : 0)
|
251
|
+
|
252
|
+
###############################################################################
|
253
|
+
# Dns
|
254
|
+
###############################################################################
|
255
|
+
|
256
|
+
when 'app-dns'
|
257
|
+
usage('pi app-dns [appname]')
|
258
|
+
set_cmd(:dns, :app_dns, @args.size == 1 ? 1 : 0)
|
259
|
+
|
260
|
+
when 'map-dns'
|
261
|
+
usage('pi map-dns [appname]')
|
262
|
+
set_cmd(:dns, :map_dns, @args.size == 1 ? 1 : 0)
|
263
|
+
|
264
|
+
when 'unmap-dns'
|
265
|
+
usage('pi unmap-dns [appname]')
|
266
|
+
set_cmd(:dns, :unmap_dns, @args.size == 1 ? 1 : 0)
|
267
|
+
|
268
|
+
###############################################################################
|
269
|
+
# Admin
|
270
|
+
###############################################################################
|
271
|
+
|
272
|
+
when 'users'
|
273
|
+
usage('pi users')
|
274
|
+
set_cmd(:admin, :users)
|
275
|
+
|
276
|
+
###############################################################################
|
277
|
+
|
170
278
|
when 'usage'
|
171
279
|
display basic_usage
|
172
280
|
exit(true)
|
data/lib/cli/usage.rb
CHANGED
@@ -47,6 +47,30 @@ Currently available pi commands are:
|
|
47
47
|
project-commits [projectname] List the commit log for the project
|
48
48
|
project-apps [projectname] List the applications for the project
|
49
49
|
upload [projectname] Upload the war package for java project
|
50
|
+
|
51
|
+
Application
|
52
|
+
apps List deployed applications for the project
|
53
|
+
create-app [appname] Create a new application
|
54
|
+
delete-app [appid] Delete the application
|
55
|
+
start-app [appid] Start the application
|
56
|
+
stop-app [appid] Stop the application
|
57
|
+
restart-app [appid] Restart the application
|
58
|
+
scale-app [appid] Scale the application instances up or down
|
59
|
+
update-app [appid] Update the application
|
60
|
+
status [appname] Display resource usage for the application
|
61
|
+
app-env [appid] Display the environments for the application
|
62
|
+
create-env [appid] Create the environment for the application
|
63
|
+
delete-env [appid] Delete the environment for the application
|
64
|
+
app-log [appid] List the logs for the application
|
65
|
+
|
66
|
+
Service
|
67
|
+
app-service [appname] Display the bind services for the application
|
68
|
+
bind-service [appname] Bind a service to an application
|
69
|
+
unbind-service [appname] Unbind a service to an application
|
70
|
+
DNS
|
71
|
+
app-dns [appname] Display the mapped urls for the application
|
72
|
+
map-dns [appname] Map the url for the application
|
73
|
+
unmap-dns [appname] Unmap the url for the application
|
50
74
|
USAGE
|
51
75
|
|
52
76
|
end
|
data/lib/cli/version.rb
CHANGED
data/lib/pi/client.rb
CHANGED
@@ -37,6 +37,10 @@ class PI::Client
|
|
37
37
|
# Users
|
38
38
|
#####################################################
|
39
39
|
|
40
|
+
def check_url
|
41
|
+
http_get
|
42
|
+
end
|
43
|
+
|
40
44
|
def login(user, password)
|
41
45
|
status, body, headers = json_post("#{PI::TOKEN_PATH}", {:password => password,:userName => user})
|
42
46
|
response_info = json_parse(body)
|
@@ -74,7 +78,7 @@ class PI::Client
|
|
74
78
|
end
|
75
79
|
|
76
80
|
def frameworks(runtime)
|
77
|
-
json_get("#{PI::INFO_PATH}/frameworks
|
81
|
+
json_get("#{PI::INFO_PATH}/frameworks?runtime=#{runtime}")
|
78
82
|
end
|
79
83
|
|
80
84
|
#####################################################
|
@@ -85,6 +89,10 @@ class PI::Client
|
|
85
89
|
json_get("#{PI::PROJECT_PATH}/list")
|
86
90
|
end
|
87
91
|
|
92
|
+
def project_get(projectname)
|
93
|
+
json_get("#{PI::PROJECT_PATH}/get?projectName=#{projectname}")
|
94
|
+
end
|
95
|
+
|
88
96
|
def create_project(name, manifest={})
|
89
97
|
status, body, headers = json_post("#{PI::PROJECT_PATH}/create", manifest)
|
90
98
|
end
|
@@ -113,7 +121,144 @@ class PI::Client
|
|
113
121
|
def project_apps(projectname)
|
114
122
|
json_get("#{PI::PROJECT_PATH}/apps/#{projectname}")
|
115
123
|
end
|
124
|
+
|
125
|
+
def project_binary(projectid)
|
126
|
+
json_get("#{PI::PROJECT_PATH}/binary/list?query=project_id%3D#{projectid}")
|
127
|
+
end
|
128
|
+
|
129
|
+
def project_branchs(projectname)
|
130
|
+
json_get("#{PI::PROJECT_PATH}/branchs/#{projectname}")
|
131
|
+
end
|
116
132
|
|
133
|
+
#####################################################
|
134
|
+
# applications
|
135
|
+
#####################################################
|
136
|
+
|
137
|
+
def apps(projectid, queryParam = nil)
|
138
|
+
queryParam = { :pageNum => -1, :NumPerPage => -1} unless queryParam
|
139
|
+
json_get("#{PI::APP_PATH}/list?projectId=#{projectid}&pageNum=#{queryParam[:pageNum]}&numPerPage=#{queryParam[:NumPerPage]}")
|
140
|
+
end
|
141
|
+
|
142
|
+
def app_sum(projectid)
|
143
|
+
http_get("#{PI::APP_PATH}/sum?projectId=#{projectid}")
|
144
|
+
end
|
145
|
+
|
146
|
+
def app_get_byname(appname)
|
147
|
+
json_get("#{PI::APP_PATH}/get?appName=#{appname}")
|
148
|
+
end
|
149
|
+
|
150
|
+
def app_get_byid(appid)
|
151
|
+
json_get("#{PI::APP_PATH}/get?appId=#{appid}")
|
152
|
+
end
|
153
|
+
|
154
|
+
def create_app(projectid,manifest={})
|
155
|
+
status, body, headers = json_post("#{PI::APP_PATH}/create?projectId=#{projectid}", manifest)
|
156
|
+
end
|
157
|
+
|
158
|
+
def target_memory(targetname)
|
159
|
+
http_get("#{PI::APP_PATH}/target/memory?targetName=#{targetname}")
|
160
|
+
end
|
161
|
+
|
162
|
+
def app_message(appname,message)
|
163
|
+
json_get("#{PI::APP_PATH}/message?appName=#{appname}&eventName=#{message}")
|
164
|
+
end
|
165
|
+
|
166
|
+
def delete_app(appid)
|
167
|
+
http_delete("#{PI::APP_PATH}/delete?appId=#{appid}",'application/json')
|
168
|
+
end
|
169
|
+
|
170
|
+
def start_app(appid)
|
171
|
+
json_get("#{PI::APP_PATH}/start?appId=#{appid}")
|
172
|
+
end
|
173
|
+
|
174
|
+
def stop_app(appid)
|
175
|
+
json_get("#{PI::APP_PATH}/stop?appId=#{appid}")
|
176
|
+
end
|
177
|
+
|
178
|
+
def scale_app(appid,instance)
|
179
|
+
json_get("#{PI::APP_PATH}/scale?appId=#{appid}&instance=#{instance}")
|
180
|
+
end
|
181
|
+
|
182
|
+
def update_app(appid,tag)
|
183
|
+
json_get("#{PI::APP_PATH}/rollback?appId=#{appid}&tag=#{tag}")
|
184
|
+
end
|
185
|
+
|
186
|
+
def status(appname)
|
187
|
+
json_get("#{PI::APP_PATH}/monitor?appName=#{appname}")
|
188
|
+
end
|
189
|
+
|
190
|
+
def app_env(appname)
|
191
|
+
json_get("#{PI::APP_PATH}/env/list?appName=#{appname}")
|
192
|
+
end
|
193
|
+
|
194
|
+
def create_env(appname,manifest=nil)
|
195
|
+
json_post("#{PI::APP_PATH}/env/save?appName=#{appname}",manifest)
|
196
|
+
end
|
197
|
+
|
198
|
+
def delete_env(appname,manifest=nil)
|
199
|
+
json_post("#{PI::APP_PATH}/env/delete?appName=#{appname}",manifest)
|
200
|
+
end
|
201
|
+
|
202
|
+
def env_verify(appname,name)
|
203
|
+
http_get("#{PI::APP_PATH}/env/verify?appName=#{appname}&name=#{name}")
|
204
|
+
end
|
205
|
+
|
206
|
+
def app_log(appid,filepath,instanceindex)
|
207
|
+
http_get("#{PI::APP_PATH}/logs?appId=#{appid}&filePath=#{filepath}&instanceIndex=#{instanceindex}")
|
208
|
+
end
|
209
|
+
|
210
|
+
#####################################################
|
211
|
+
# services
|
212
|
+
#####################################################
|
213
|
+
|
214
|
+
def usable_services(appname)
|
215
|
+
json_get("#{PI::APP_PATH}/service/usable?appName=#{appname}")
|
216
|
+
end
|
217
|
+
|
218
|
+
def app_service(appname)
|
219
|
+
json_get("#{PI::APP_PATH}/service/binded?appName=#{appname}")
|
220
|
+
end
|
221
|
+
|
222
|
+
def bind_service(appname, manifest=nil)
|
223
|
+
json_post("#{PI::APP_PATH}/service/bind?appName=#{appname}",manifest)
|
224
|
+
end
|
225
|
+
|
226
|
+
def unbind_service(appname, manifest=nil)
|
227
|
+
json_post("#{PI::APP_PATH}/service/unbind?appName=#{appname}",manifest)
|
228
|
+
end
|
229
|
+
|
230
|
+
#####################################################
|
231
|
+
# dns
|
232
|
+
#####################################################
|
233
|
+
|
234
|
+
def usable_dns(appname)
|
235
|
+
json_get("#{PI::APP_PATH}/url/usable?appName=#{appname}")
|
236
|
+
end
|
237
|
+
|
238
|
+
def app_dns(appname)
|
239
|
+
json_get("#{PI::APP_PATH}/url/mapped?appName=#{appname}")
|
240
|
+
end
|
241
|
+
|
242
|
+
def map_dns(appname, manifest=nil)
|
243
|
+
json_post("#{PI::APP_PATH}/url/map?appName=#{appname}",manifest)
|
244
|
+
end
|
245
|
+
|
246
|
+
def unmap_dns(appname, manifest=nil)
|
247
|
+
json_post("#{PI::APP_PATH}/url/unmap?appName=#{appname}",manifest)
|
248
|
+
end
|
249
|
+
|
250
|
+
#####################################################
|
251
|
+
# administration
|
252
|
+
#####################################################
|
253
|
+
|
254
|
+
def admin_domains
|
255
|
+
json_get("#{PI::ADMIN_PATH}/domains")
|
256
|
+
end
|
257
|
+
|
258
|
+
def admin_users(domainid)
|
259
|
+
json_get("#{PI::ADMIN_PATH}/users?query=domain_id%3D#{domainid}")
|
260
|
+
end
|
261
|
+
|
117
262
|
######################################################
|
118
263
|
|
119
264
|
private
|
@@ -162,7 +307,7 @@ class PI::Client
|
|
162
307
|
request(:delete, path,content_type)
|
163
308
|
end
|
164
309
|
|
165
|
-
def request(method, path, content_type = nil,
|
310
|
+
def request(method, path, content_type = nil, payload = nil, headers = {})
|
166
311
|
headers = headers.dup
|
167
312
|
headers['Authentication'] = @auth_token if @auth_token
|
168
313
|
if content_type
|
@@ -232,11 +377,11 @@ class PI::Client
|
|
232
377
|
|
233
378
|
def parse_error_message(status, body)
|
234
379
|
parsed_body = json_parse(body.to_s)
|
235
|
-
if parsed_body && parsed_body[:
|
236
|
-
desc = parsed_body[:
|
237
|
-
"
|
380
|
+
if parsed_body && parsed_body[:errorCode] && parsed_body[:errorDescription]
|
381
|
+
desc = parsed_body[:errorDescription].gsub("\"","'")
|
382
|
+
"\nError (#{parsed_body[:errorCode]}): #{desc}"
|
238
383
|
else
|
239
|
-
"
|
384
|
+
"\nError (HTTP #{status}): #{body}"
|
240
385
|
end
|
241
386
|
rescue JSON::ParserError
|
242
387
|
if body.nil? || body.empty?
|