pi 0.1.23 → 0.1.24
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 +367 -404
- data/lib/cli.rb +1 -0
- data/lib/cli/choose_helper.rb +123 -25
- data/lib/cli/commands/apps.rb +241 -303
- data/lib/cli/commands/dns.rb +38 -73
- data/lib/cli/commands/projects.rb +179 -160
- data/lib/cli/commands/services.rb +55 -80
- data/lib/cli/commands/user.rb +26 -10
- data/lib/cli/interact_helper.rb +538 -0
- data/lib/cli/runner.rb +77 -53
- data/lib/cli/usage.rb +55 -39
- data/lib/cli/version.rb +1 -1
- data/lib/pi/client.rb +92 -77
- data/lib/pi/const.rb +2 -0
- metadata +5 -5
- data/lib/cli/commands/admin.rb +0 -19
data/lib/cli.rb
CHANGED
@@ -10,6 +10,7 @@ module PI
|
|
10
10
|
autoload :Config, "#{ROOT}/cli/config"
|
11
11
|
autoload :Runner, "#{ROOT}/cli/runner"
|
12
12
|
autoload :ChooseHelper, "#{ROOT}/cli/choose_helper"
|
13
|
+
autoload :InteractHelper, "#{ROOT}/cli/interact_helper"
|
13
14
|
|
14
15
|
module Command
|
15
16
|
autoload :Base, "#{ROOT}/cli/commands/base"
|
data/lib/cli/choose_helper.rb
CHANGED
@@ -1,50 +1,148 @@
|
|
1
|
+
require "set"
|
1
2
|
module PI::Cli
|
2
3
|
module ChooseHelper
|
3
4
|
|
5
|
+
YES_SET = Set.new(["y", "Y", "yes", "YES"])
|
6
|
+
NO_SET = Set.new(["n", "N", "no", "NO"])
|
7
|
+
|
4
8
|
def choose_project
|
5
9
|
projects = client.projects
|
6
10
|
err "No Projects" if projects.nil? || projects.empty?
|
7
|
-
useproject = nil
|
8
11
|
projects.sort! {|a, b| a[:name] <=> b[:name] }
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
menu.select_by = :index_or_name
|
13
|
-
projects.each do |project|
|
14
|
-
menu.choice("#{project[:name]}") { useproject = project }
|
15
|
-
end
|
12
|
+
project_choices = Array.new
|
13
|
+
projects.each do |p|
|
14
|
+
project_choices << p[:name]
|
16
15
|
end
|
16
|
+
useproject = ask "Select Project", :choices => project_choices, :indexed => true
|
17
17
|
display "Selected Project: ",false
|
18
|
-
display "#{useproject
|
19
|
-
|
18
|
+
display "#{useproject}"
|
19
|
+
projects.each do |p|
|
20
|
+
return p if p[:name] == useproject
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def choose_target
|
25
|
+
targets = client.targets
|
26
|
+
err "No Targets" if targets.nil? || targets.empty?
|
27
|
+
targets.sort! {|a, b| a[:name] <=> b[:name] }
|
28
|
+
target_choices = Array.new
|
29
|
+
targets.each do |p|
|
30
|
+
target_choices << p[:name]
|
31
|
+
end
|
32
|
+
usetarget = ask "Select Target", :choices => target_choices, :indexed => true
|
33
|
+
display "Selected Target: ",false
|
34
|
+
display "#{usetarget}"
|
35
|
+
targets.each do |p|
|
36
|
+
return p if p[:name] == usetarget
|
37
|
+
end
|
20
38
|
end
|
21
39
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
40
|
+
def select_apps
|
41
|
+
choices = ["all","project","target"]
|
42
|
+
select_type = ask"Select application by", :choices => choices, :indexed => true
|
43
|
+
display "Select application by #{select_type}"
|
44
|
+
case select_type
|
45
|
+
when "all"
|
46
|
+
app = client.apps
|
47
|
+
when "project"
|
48
|
+
useproject = choose_project
|
49
|
+
app = client.apps(useproject[:name])
|
50
|
+
when "target"
|
51
|
+
usetarget = choose_target
|
52
|
+
project=nil
|
53
|
+
app = client.apps(project, usetarget[:name])
|
54
|
+
else
|
55
|
+
if select_type
|
56
|
+
err "Unknown select type [#{select_type}]"
|
33
57
|
end
|
34
58
|
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def choose_app
|
62
|
+
apps = select_apps
|
63
|
+
err "No application!" if apps.nil? || apps.empty?
|
64
|
+
app_choices = Array.new
|
65
|
+
apps.each do |a|
|
66
|
+
app_choices << a[:name]
|
67
|
+
end
|
68
|
+
appname = ask "Select Application", :choices => app_choices, :indexed => true
|
35
69
|
display "Selected Application: ",false
|
36
|
-
display "#{
|
37
|
-
|
70
|
+
display "#{appname}"
|
71
|
+
apps.each do |a|
|
72
|
+
return a if a[:name] == appname
|
73
|
+
end
|
38
74
|
end
|
39
75
|
|
40
|
-
|
76
|
+
def choose_app_help(appid_or_appname)
|
77
|
+
target = @options[:target]
|
78
|
+
target_not_all = true
|
79
|
+
if appid_or_appname =~ /^[1-9]\d*$/
|
80
|
+
appid = appid_or_appname
|
81
|
+
app = client.app_get_byid(appid)
|
82
|
+
return target_not_all, app
|
83
|
+
elsif appid_or_appname == nil
|
84
|
+
if target.nil?
|
85
|
+
app = choose_app
|
86
|
+
return target_not_all, app
|
87
|
+
else
|
88
|
+
err "Not enough arguments"
|
89
|
+
end
|
90
|
+
else
|
91
|
+
appname = appid_or_appname
|
92
|
+
err "Not enough arguments" if target == nil
|
93
|
+
if target != "all"
|
94
|
+
app = client.app_search(target, appname)
|
95
|
+
err "The application '#{appname}' is not found!" if app[:id] == 0
|
96
|
+
return target_not_all, app
|
97
|
+
else
|
98
|
+
apps = client.app_search_target_is_all(appname)
|
99
|
+
err "The application '#{appname}' is not found!" if apps.size == 0
|
100
|
+
target_not_all = false
|
101
|
+
return target_not_all, apps
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def choose_app_help_target_not_all(appid_or_appname)
|
107
|
+
target = @options[:target]
|
108
|
+
if appid_or_appname =~ /^[1-9]\d*$/
|
109
|
+
appid = appid_or_appname
|
110
|
+
app = client.app_get_byid(appid)
|
111
|
+
return app
|
112
|
+
elsif appid_or_appname == nil
|
113
|
+
if target.nil?
|
114
|
+
app = choose_app
|
115
|
+
return app
|
116
|
+
else
|
117
|
+
err "Not enough arguments"
|
118
|
+
end
|
119
|
+
else
|
120
|
+
appname = appid_or_appname
|
121
|
+
err "Not enough arguments" if target == nil
|
122
|
+
app = client.app_search(target, appname)
|
123
|
+
err "The application '#{appname}' is not found!" if app[:id] == 0
|
124
|
+
return app
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def check_status(target, appname, eventname)
|
41
129
|
for i in 1..12 do
|
42
|
-
result = client.app_message(appname,eventname)
|
130
|
+
result = client.app_message(target,appname,eventname)
|
43
131
|
break result unless result[:text].empty?
|
44
132
|
sleep(10)
|
45
133
|
end
|
46
134
|
return result
|
47
135
|
end
|
136
|
+
|
137
|
+
# only [a-zA-Z0-9] for project name and app name (size <=18)
|
138
|
+
def check_name_valid?(name)
|
139
|
+
(name =~ /^\w+$/ && name.size <= 18) ? true : false
|
140
|
+
end
|
141
|
+
|
142
|
+
#not include number, ', ", \, and begin with vcap_, vmc_ for env name (size <= 18)
|
143
|
+
def check_envname_valid?(name)
|
144
|
+
(name =~ /\b(?!vcap_|vmc_)\D+\b/ && name =~ /^[^\'\"\\]+$/ && name.size <= 18) ? true : false
|
145
|
+
end
|
48
146
|
|
49
147
|
end
|
50
148
|
end
|
data/lib/cli/commands/apps.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
require "rubygems"
|
2
|
-
|
3
|
-
require "set"
|
2
|
+
|
4
3
|
module PI::Cli::Command
|
5
4
|
class Apps < Base
|
6
5
|
include PI::Cli::ChooseHelper
|
7
|
-
include
|
6
|
+
include PI::Cli::InteractHelper
|
8
7
|
DEFAULTS = {
|
9
8
|
"mem" => "64M",
|
10
9
|
"instances" => 1,
|
@@ -12,16 +11,18 @@ module PI::Cli::Command
|
|
12
11
|
"isDebug" => false,
|
13
12
|
"needMonitor" => false
|
14
13
|
}
|
15
|
-
YES_SET = Set.new(["y", "Y", "yes", "YES"])
|
16
14
|
|
17
|
-
def apps
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
def apps
|
16
|
+
client.check_login_status
|
17
|
+
project = @options[:project]
|
18
|
+
target = @options[:target]
|
19
|
+
project = nil if project == "all"
|
20
|
+
target = nil if target == "all"
|
21
|
+
app_sum = client.app_sum(project, target)
|
23
22
|
total_app = Integer(app_sum[1])
|
24
23
|
return display "No Applications" if total_app == 0
|
24
|
+
pageNum = -1
|
25
|
+
numPerPage = -1
|
25
26
|
if total_app >= 50
|
26
27
|
puts "Total applications: #{total_app}."
|
27
28
|
numPerPage = nil
|
@@ -47,103 +48,82 @@ module PI::Cli::Command
|
|
47
48
|
break
|
48
49
|
end
|
49
50
|
}
|
50
|
-
pageNum = pageNum.to_i
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
queryParam = {
|
56
|
-
:pageNum => pageNum,
|
57
|
-
:NumPerPage => numPerPage
|
58
|
-
}
|
59
|
-
apps = client.apps(projectid, queryParam)
|
51
|
+
pageNum = pageNum.to_i
|
52
|
+
end
|
53
|
+
apps = client.apps(project, target, pageNum, numPerPage)
|
54
|
+
return display "No Applications" if apps.nil? || apps.empty?
|
60
55
|
return display JSON.pretty_generate(apps) if @options[:json]
|
61
|
-
return display "No Applications" if apps.nil? || apps.empty?
|
62
56
|
apps.sort! {|a, b| a[:name] <=> b[:name] }
|
63
57
|
apps_table = table do |t|
|
64
|
-
t.headings = 'Target', 'App name', 'URL', 'Deploy Type','Version', 'Status', 'Instances', 'Running Instances'
|
58
|
+
t.headings = 'ID', 'Target', 'App name', 'URL', 'Deploy Type','Version', 'Status', 'Instances', 'Running Instances'
|
65
59
|
apps.each do |app|
|
66
|
-
t << [app[:targetName], app[:name] ,app[:url], app[:deployType], app[:tag], app[:status], app[:instances], app[:runInstances]]
|
60
|
+
t << [app[:id], app[:targetName], app[:name] ,app[:url], app[:deployType], app[:tag], app[:status], app[:instances], app[:runInstances]]
|
67
61
|
end
|
68
62
|
end
|
69
63
|
display apps_table
|
70
64
|
end
|
71
65
|
|
72
66
|
def create_app(appname=nil)
|
73
|
-
|
74
|
-
|
67
|
+
client.check_login_status
|
68
|
+
binarylist, deployType, instances = nil, nil, nil
|
69
|
+
# choose the target
|
70
|
+
targets = client.targets
|
71
|
+
err "No Targets!" if targets.nil? || targets.empty?
|
72
|
+
target_choices = Array.new
|
73
|
+
targets.each do |t|
|
74
|
+
target_choices << t[:name]
|
75
|
+
end
|
76
|
+
target = ask "Select Target", :choices => target_choices, :indexed => true
|
77
|
+
display "Selected Target: ",false
|
78
|
+
display "#{target}"
|
79
|
+
target_memory = client.target_memory(target)
|
80
|
+
target_memory = target_memory[1]
|
81
|
+
display ("Available memory: #{target_memory} M")
|
82
|
+
|
83
|
+
# choose the project
|
84
|
+
useproject = choose_project
|
85
|
+
projectname = useproject[:name]
|
86
|
+
projectid = useproject[:id]
|
87
|
+
|
88
|
+
loop{
|
75
89
|
appname = ask "Application Name" unless appname
|
76
|
-
if
|
90
|
+
if not check_name_valid?(appname)
|
91
|
+
display "Invalid application name '#{appname}'."
|
92
|
+
appname =nil
|
93
|
+
next
|
94
|
+
else if app_exists?(target, appname)
|
77
95
|
display "Application '#{appname}' already exists."
|
78
96
|
appname =nil
|
79
|
-
next
|
80
|
-
else
|
97
|
+
next
|
98
|
+
else
|
81
99
|
break
|
100
|
+
end
|
82
101
|
end
|
83
102
|
}
|
84
|
-
|
85
|
-
# choose the project
|
86
|
-
useproject = choose_project
|
87
|
-
projectid = useproject[:id]
|
88
|
-
|
103
|
+
|
89
104
|
# choose the tag
|
90
105
|
if useproject[:runtime] =~ /^(ruby)/i
|
91
|
-
|
92
|
-
err "No tags!" if
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
else
|
98
|
-
choose do |menu|
|
99
|
-
display "=============Tags==============="
|
100
|
-
menu.prompt = "Select Tag: "
|
101
|
-
menu.select_by = :index_or_name
|
102
|
-
tag.each do |t|
|
103
|
-
menu.choice(t) { tag = t }
|
104
|
-
end
|
105
|
-
end
|
106
|
-
display "Selected Version: ",false
|
107
|
-
display "#{tag}"
|
108
|
-
deployType = "git"
|
109
|
-
end
|
106
|
+
tags = client.project_tags(useproject[:name])
|
107
|
+
err "No tags!" if tags.nil? || tags.empty?
|
108
|
+
tag = ask "Select Tag", :choices => tags, :indexed => true
|
109
|
+
display "Selected Tag: ",false
|
110
|
+
display "#{tag}"
|
111
|
+
deployType = "git"
|
110
112
|
else
|
111
|
-
binarylist = client.project_binary(
|
113
|
+
binarylist = client.project_binary(projectname)
|
112
114
|
err "No version!" if binarylist.nil? || binarylist.empty?
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
menu.select_by = :index_or_name
|
117
|
-
binarylist.each do |version|
|
118
|
-
menu.choice("#{version[:versionName]}") { tag = version }
|
119
|
-
end
|
115
|
+
binary_choices = Array.new
|
116
|
+
binarylist.each do |b|
|
117
|
+
binary_choices << b[:versionName]
|
120
118
|
end
|
119
|
+
tag = ask "Select Version", :choices => binary_choices, :indexed => true
|
121
120
|
display "Selected Version: ",false
|
122
|
-
display "#{tag
|
123
|
-
tag = tag[:versionName]
|
121
|
+
display "#{tag}"
|
124
122
|
deployType = "binary"
|
125
|
-
end
|
126
|
-
|
127
|
-
# choose the target
|
128
|
-
targets = client.targets
|
129
|
-
err "No Targets!" if targets.nil? || targets.empty?
|
130
|
-
usetarget = nil
|
131
|
-
choose do |menu|
|
132
|
-
display "=============Targets============"
|
133
|
-
menu.prompt = "Select Target: "
|
134
|
-
menu.select_by = :index_or_name
|
135
|
-
targets.each do |target|
|
136
|
-
menu.choice("#{target[:name]}-#{target[:targetUrl]}") { usetarget = target }
|
137
|
-
end
|
138
|
-
end
|
139
|
-
display "Selected Target: ",false
|
140
|
-
display "#{usetarget[:name]}-#{usetarget[:targetUrl]}"
|
141
|
-
target_memory = client.target_memory(usetarget[:name])
|
142
|
-
target_memory = target_memory[1]
|
143
|
-
display ("Available memory: #{target_memory} M")
|
123
|
+
end
|
144
124
|
# URL combination
|
145
125
|
user = client.user_info
|
146
|
-
url = "#{appname}.#{user[:userName]}.#{
|
126
|
+
url = "#{appname}.#{user[:userName]}.#{target}.samsungpaas.com"
|
147
127
|
display "URL: #{url}"
|
148
128
|
# choose the mem
|
149
129
|
mem = ask "Memory reservation", :default => DEFAULTS["mem"], :choices => ["64M", "128M", "256M", "512M", "1G", "2G"]
|
@@ -161,48 +141,25 @@ module PI::Cli::Command
|
|
161
141
|
break
|
162
142
|
end
|
163
143
|
}
|
164
|
-
|
144
|
+
isDebug = false
|
165
145
|
isDebug = ask "Need debug?", :default => DEFAULTS["isDebug"] if deployType == "binary"
|
166
146
|
needRestart = ask "Need restart?", :default => DEFAULTS["needRestart"]
|
167
147
|
needMonitor = ask "Need monitor?", :default => DEFAULTS["needMonitor"]
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
isDebug = "no"
|
172
|
-
end
|
173
|
-
if not needRestart.nil?
|
174
|
-
needRestart = (needRestart == false ? "no" : "yes")
|
175
|
-
else
|
176
|
-
needRestart = "no"
|
177
|
-
end
|
178
|
-
if not needMonitor.nil?
|
179
|
-
needMonitor = (needMonitor == false ? "no" : "yes")
|
180
|
-
else
|
181
|
-
needMonitor = "no"
|
182
|
-
end
|
148
|
+
isDebug = (isDebug == false ? "no" : "yes")
|
149
|
+
needRestart = (needRestart == false ? "no" : "yes")
|
150
|
+
needMonitor = (needMonitor == false ? "no" : "yes")
|
183
151
|
# choose the branch
|
184
|
-
|
185
|
-
err "No branchs!" if
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
else
|
190
|
-
choose do |menu|
|
191
|
-
display "=============Branchs============"
|
192
|
-
menu.prompt = "Select Branch: "
|
193
|
-
menu.default = "master"
|
194
|
-
menu.select_by = :index_or_name
|
195
|
-
branch.each do |b|
|
196
|
-
menu.choice(b) { branch = b }
|
197
|
-
end
|
198
|
-
end
|
199
|
-
display "Selected Branch: ",false
|
200
|
-
display "#{branch}"
|
201
|
-
end
|
152
|
+
branchs = client.project_branchs(useproject[:name])
|
153
|
+
err "No branchs!" if branchs.nil? || branchs.empty?
|
154
|
+
branch = ask "Select Branch", :choices => branchs, :indexed => true, :default => "master"
|
155
|
+
display "Selected Branch: ",false
|
156
|
+
display "#{branch}"
|
202
157
|
|
203
158
|
manifest = {
|
159
|
+
:targetName => target,
|
204
160
|
:name => "#{appname}",
|
205
|
-
:
|
161
|
+
:projectName => "#{projectname}",
|
162
|
+
:projectId => "#{projectid}",
|
206
163
|
:branch => branch,
|
207
164
|
:url => url,
|
208
165
|
:memory => mem_quota,
|
@@ -224,8 +181,8 @@ module PI::Cli::Command
|
|
224
181
|
end
|
225
182
|
end
|
226
183
|
|
227
|
-
client.create_app(
|
228
|
-
result = check_status(appname, "create")
|
184
|
+
client.create_app(manifest)
|
185
|
+
result = check_status(target, appname, "create")
|
229
186
|
Thread.kill(t)
|
230
187
|
if result[:code] == 200
|
231
188
|
if not result[:text].empty?
|
@@ -238,14 +195,10 @@ module PI::Cli::Command
|
|
238
195
|
end
|
239
196
|
end
|
240
197
|
|
241
|
-
def delete_app(
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
useapp = choose_app(projectid)
|
246
|
-
appid = useapp[:id]
|
247
|
-
end
|
248
|
-
err "The application is not found! App id :#{appid}" unless app_exists_byappid?(appid)
|
198
|
+
def delete_app(appid_or_appname=nil)
|
199
|
+
client.check_login_status
|
200
|
+
app = choose_app_help_target_not_all(appid_or_appname)
|
201
|
+
|
249
202
|
display "Deleting application: ",false
|
250
203
|
|
251
204
|
t = Thread.new do
|
@@ -256,79 +209,62 @@ module PI::Cli::Command
|
|
256
209
|
end
|
257
210
|
end
|
258
211
|
|
259
|
-
client.delete_app(
|
212
|
+
client.delete_app(app[:id])
|
260
213
|
Thread.kill(t)
|
261
214
|
display "OK".green
|
262
215
|
end
|
263
216
|
|
264
|
-
def start_app(
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
end
|
271
|
-
app = client.app_get_byid(appid)
|
272
|
-
err "The application is not found! App id :#{appid}" unless (appid.to_f == app[:id] ? true : false)
|
273
|
-
display "Starting application: ",false
|
274
|
-
|
275
|
-
t = Thread.new do
|
276
|
-
loop do
|
277
|
-
display '.', false
|
278
|
-
sleep (1)
|
279
|
-
break unless t.alive?
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
client.start_app(appid)
|
284
|
-
result = check_status(app[:name], "start")
|
285
|
-
Thread.kill(t)
|
286
|
-
if result[:code] == 200
|
287
|
-
display "OK".green
|
217
|
+
def start_app(appid_or_appname=nil)
|
218
|
+
client.check_login_status
|
219
|
+
target_not_all, app = choose_app_help(appid_or_appname)
|
220
|
+
if target_not_all
|
221
|
+
return display "The application '#{app[:name]}'(target:#{app[:targetName]}) has already started.".yellow if app[:status] == "STARTED"
|
222
|
+
do_start_app(app)
|
288
223
|
else
|
289
|
-
|
224
|
+
app.each do |a|
|
225
|
+
next display "The application '#{a[:name]}'(target:#{a[:targetName]}) has already started.".yellow if a[:status] == "STARTED"
|
226
|
+
do_start_app(a)
|
227
|
+
end
|
290
228
|
end
|
291
229
|
end
|
292
230
|
|
293
|
-
def stop_app(
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
231
|
+
def stop_app(appid_or_appname=nil)
|
232
|
+
client.check_login_status
|
233
|
+
target_not_all, app = choose_app_help(appid_or_appname)
|
234
|
+
if target_not_all
|
235
|
+
return display "The application '#{app[:name]}'(target:#{app[:targetName]}) has already stopped.".yellow if app[:status] == "STOPPED"
|
236
|
+
do_stop_app(app)
|
237
|
+
else
|
238
|
+
app.each do |a|
|
239
|
+
next display "The application '#{a[:name]}'(target:#{a[:targetName]}) has already stopped.".yellow if a[:status] == "STOPPED"
|
240
|
+
do_stop_app(a)
|
241
|
+
end
|
299
242
|
end
|
300
|
-
err "The application is not found! App id :#{appid}" unless app_exists_byappid?(appid)
|
301
|
-
display "Stoping application: ",false
|
302
|
-
client.stop_app(appid)
|
303
|
-
display "OK".green
|
304
243
|
end
|
305
244
|
|
306
|
-
def restart_app(
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
245
|
+
def restart_app(appid_or_appname=nil)
|
246
|
+
client.check_login_status
|
247
|
+
target_not_all, app = choose_app_help(appid_or_appname)
|
248
|
+
if target_not_all
|
249
|
+
do_stop_app(app) if app[:status] == "STARTED"
|
250
|
+
do_start_app(app)
|
251
|
+
else
|
252
|
+
app.each do |a|
|
253
|
+
do_stop_app(a) if a[:status] == "STARTED"
|
254
|
+
do_start_app(a)
|
255
|
+
end
|
312
256
|
end
|
313
|
-
app = client.app_get_byid(appid)
|
314
|
-
err "The application is not found! App id :#{appid}" unless (appid.to_f == app[:id] ? true : false)
|
315
|
-
stop_app(appid)
|
316
|
-
start_app(appid)
|
317
257
|
end
|
318
258
|
|
319
|
-
def scale_app(
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
useapp = choose_app(projectid)
|
324
|
-
appid = useapp[:id]
|
325
|
-
end
|
326
|
-
app = client.app_get_byid(appid)
|
327
|
-
err "The application is not found! App id :#{appid}" unless (appid.to_f == app[:id] ? true : false)
|
328
|
-
instance = nil
|
259
|
+
def scale_app(appid_or_appname=nil)
|
260
|
+
client.check_login_status
|
261
|
+
instance = @options[:instance]
|
262
|
+
app = choose_app_help_target_not_all(appid_or_appname)
|
329
263
|
loop{
|
330
|
-
instance
|
331
|
-
|
264
|
+
unless instance
|
265
|
+
instance = ask "How many instances?", :default => app[:instances]
|
266
|
+
instance = instance.to_s
|
267
|
+
end
|
332
268
|
if not instance =~ /^[1-9]\d*$/
|
333
269
|
display "Invalid Number!"
|
334
270
|
instance =nil
|
@@ -337,6 +273,7 @@ module PI::Cli::Command
|
|
337
273
|
break
|
338
274
|
end
|
339
275
|
}
|
276
|
+
err "Don't need scale application" if instance == app[:instances].to_s
|
340
277
|
display "Scaling application: ",false
|
341
278
|
|
342
279
|
t = Thread.new do
|
@@ -347,59 +284,39 @@ module PI::Cli::Command
|
|
347
284
|
end
|
348
285
|
end
|
349
286
|
|
350
|
-
client.scale_app(
|
351
|
-
result = check_status(app[:name], "scale")
|
287
|
+
client.scale_app(app[:id],instance)
|
288
|
+
result = check_status(app[:targetName],app[:name], "scale")
|
352
289
|
Thread.kill(t)
|
353
|
-
if result[:code] == 200
|
354
|
-
|
290
|
+
if result[:code] == 200
|
291
|
+
if not result[:text].empty?
|
292
|
+
display "OK".green
|
293
|
+
else
|
294
|
+
display "Please try again"
|
295
|
+
end
|
355
296
|
else
|
356
297
|
err result[:text]
|
357
298
|
end
|
358
299
|
end
|
359
300
|
|
360
|
-
def update_app(
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
app = client.app_get_byid(appid)
|
369
|
-
err "The application is not found! App id :#{appid}" unless (appid.to_f == app[:id] ? true : false)
|
370
|
-
if app[:deployType] == "git"
|
371
|
-
unless useproject
|
372
|
-
projects = client.projects
|
373
|
-
projects.each do |p|
|
374
|
-
projectname = p[:name] if p[:id] == app[:projectId]
|
375
|
-
end
|
376
|
-
end
|
377
|
-
tag = client.project_tags(projectname)
|
378
|
-
err "No tags!" if tag.nil? || tag.empty?
|
379
|
-
choose do |menu|
|
380
|
-
display "=============Tags==============="
|
381
|
-
menu.prompt = "Select Tag: "
|
382
|
-
menu.select_by = :index_or_name
|
383
|
-
tag.each do |t|
|
384
|
-
menu.choice(t) { tag = t }
|
385
|
-
end
|
386
|
-
end
|
301
|
+
def update_app(appid_or_appname=nil)
|
302
|
+
client.check_login_status
|
303
|
+
app = choose_app_help_target_not_all(appid_or_appname)
|
304
|
+
if app[:deployType] == "git"
|
305
|
+
tags = client.project_tags(app[:projectName])
|
306
|
+
err "No tags!" if tags.nil? || tags.empty?
|
307
|
+
tag = ask "Select Tag", :choices => tags, :indexed => true
|
308
|
+
err "Don't need update application!" if tag == app[:tag]
|
387
309
|
display "Selected tag: ",false
|
388
310
|
display "#{tag}"
|
389
|
-
else
|
390
|
-
|
391
|
-
err "No version!" if
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
menu.select_by = :index_or_name
|
396
|
-
tag.each do |version|
|
397
|
-
menu.choice("#{version[:versionName]}") { tag = version }
|
398
|
-
end
|
311
|
+
else
|
312
|
+
tags = client.project_binary(app[:projectName])
|
313
|
+
err "No version!" if tags.nil? || tags.empty?
|
314
|
+
tag_choices = Array.new
|
315
|
+
tags.each do |t|
|
316
|
+
tag_choices << t[:versionName]
|
399
317
|
end
|
400
|
-
|
401
|
-
|
402
|
-
tag = tag[:versionName]
|
318
|
+
tag = ask "Select Version", :choices => tag_choices, :indexed => true
|
319
|
+
err "Don't need update application!" if tag == app[:tag]
|
403
320
|
end
|
404
321
|
display "Updating application: ",false
|
405
322
|
|
@@ -411,26 +328,24 @@ module PI::Cli::Command
|
|
411
328
|
end
|
412
329
|
end
|
413
330
|
|
414
|
-
client.update_app(
|
415
|
-
result = check_status(app[:name], "rollback")
|
331
|
+
client.update_app(app[:id],tag)
|
332
|
+
result = check_status(app[:targetName], app[:name], "rollback")
|
416
333
|
Thread.kill(t)
|
417
|
-
if result[:code] == 200
|
418
|
-
|
334
|
+
if result[:code] == 200
|
335
|
+
if not result[:text].empty?
|
336
|
+
display "OK".green
|
337
|
+
else
|
338
|
+
display "Please try again"
|
339
|
+
end
|
419
340
|
else
|
420
341
|
err result[:text]
|
421
|
-
end
|
342
|
+
end
|
422
343
|
end
|
423
344
|
|
424
|
-
def status(
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
useapp = choose_app(projectid)
|
429
|
-
appname = useapp[:name]
|
430
|
-
end
|
431
|
-
app = client.app_get_byname(appname)
|
432
|
-
err "The application is not found! App name :#{appname}" unless (appname == app[:name] ? true : false )
|
433
|
-
status = client.status(appname)
|
345
|
+
def status(appid_or_appname=nil)
|
346
|
+
client.check_login_status
|
347
|
+
app = choose_app_help_target_not_all(appid_or_appname)
|
348
|
+
status = client.status(app[:id])
|
434
349
|
return display JSON.pretty_generate(status) if @options[:json]
|
435
350
|
return display "No Status!" if status.nil? || status.empty?
|
436
351
|
status_table = table do |t|
|
@@ -442,16 +357,10 @@ module PI::Cli::Command
|
|
442
357
|
display status_table
|
443
358
|
end
|
444
359
|
|
445
|
-
def app_env(
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
useapp = choose_app(projectid)
|
450
|
-
appname = useapp[:name]
|
451
|
-
end
|
452
|
-
app = client.app_get_byname(appname)
|
453
|
-
err "The application is not found! App name :#{appname}" unless (appname == app[:name] ? true : false)
|
454
|
-
env = client.app_env(appname)
|
360
|
+
def app_env(appid_or_appname=nil)
|
361
|
+
client.check_login_status
|
362
|
+
app = choose_app_help_target_not_all(appid_or_appname)
|
363
|
+
env = client.app_env(app[:id])
|
455
364
|
return display JSON.pretty_generate(env) if @options[:json]
|
456
365
|
return display "No Environments!" if env.nil? || env.empty?
|
457
366
|
env.sort! {|a, b| a[:name] <=> b[:name] }
|
@@ -464,70 +373,75 @@ module PI::Cli::Command
|
|
464
373
|
display env_table
|
465
374
|
end
|
466
375
|
|
467
|
-
def create_env(
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
useapp = choose_app(projectid)
|
472
|
-
appname = useapp[:name]
|
473
|
-
end
|
474
|
-
app = client.app_get_byname(appname)
|
475
|
-
err "The application is not found! App name :#{appname}" unless (appname == app[:name] ? true : false)
|
376
|
+
def create_env(appid_or_appname=nil)
|
377
|
+
client.check_login_status
|
378
|
+
app = choose_app_help_target_not_all(appid_or_appname)
|
379
|
+
|
476
380
|
name = nil
|
477
381
|
loop{
|
478
382
|
name = ask "Environment Name" unless name
|
479
|
-
if
|
480
|
-
display "
|
383
|
+
if not check_envname_valid?(name)
|
384
|
+
display "Invalid environment name '#{name}'."
|
481
385
|
name =nil
|
482
386
|
next
|
387
|
+
else if env_exists?(app[:id],name)
|
388
|
+
display "Environment '#{name}' already exists."
|
389
|
+
name =nil
|
390
|
+
next
|
483
391
|
else
|
484
392
|
break
|
485
393
|
end
|
394
|
+
end
|
486
395
|
}
|
487
396
|
value = ask "Environment Value"
|
488
397
|
manifest = {
|
489
398
|
:name => name,
|
490
399
|
:value => value
|
491
400
|
}
|
492
|
-
client.create_env(
|
401
|
+
client.create_env(app[:id], manifest)
|
493
402
|
display "OK".green
|
494
403
|
end
|
495
404
|
|
496
|
-
def delete_env(
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
405
|
+
def delete_env(appid_or_appname=nil)
|
406
|
+
client.check_login_status
|
407
|
+
app = choose_app_help_target_not_all(appid_or_appname)
|
408
|
+
|
409
|
+
envs = client.app_env(app[:id])
|
410
|
+
err "No Environments!" if envs.nil? || envs.empty?
|
411
|
+
choices = Array.new
|
412
|
+
envs.each do |s|
|
413
|
+
choices << s[:name]
|
414
|
+
end
|
415
|
+
name = asks "Environment Name", :choices => choices, :indexed => true
|
416
|
+
display "Selected Environment Name: ",false
|
417
|
+
name.each do |m|
|
418
|
+
display "#{m} ",false
|
419
|
+
end
|
420
|
+
display "\n"
|
421
|
+
|
422
|
+
delete_envs = Array.new
|
423
|
+
envs.each do |e|
|
424
|
+
name.each do |n|
|
425
|
+
delete_envs.push("#{n}=#{e[:value]}") if n == e[:name]
|
426
|
+
end
|
511
427
|
end
|
512
|
-
|
513
|
-
|
514
|
-
|
428
|
+
|
429
|
+
delete_envs.each do |env|
|
430
|
+
display "Deleting environment '#{env}': ",false
|
431
|
+
client.delete_env(app[:id], env)
|
432
|
+
display "OK".green
|
433
|
+
end
|
515
434
|
end
|
516
435
|
|
517
|
-
def app_log(
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
useapp = choose_app(projectid)
|
522
|
-
appid = useapp[:id]
|
523
|
-
end
|
524
|
-
app = client.app_get_byid(appid)
|
525
|
-
err "The application is not found! App id :#{appid}" unless (appid.to_f == app[:id] ? true : false)
|
436
|
+
def app_log(appid_or_appname=nil)
|
437
|
+
client.check_login_status
|
438
|
+
app = choose_app_help_target_not_all(appid_or_appname)
|
439
|
+
|
526
440
|
max_index = app[:instances]-1
|
527
441
|
instanceindex = ask "Select instance index(from 0 to #{max_index})", :default => 0
|
528
442
|
filepath = "logs/"
|
529
443
|
logs = client.app_log(app[:id],filepath,instanceindex)
|
530
|
-
logs = logs[1].
|
444
|
+
logs = logs[1].split("\n")
|
531
445
|
file = ask "Select logs, indexed list?", :choices => logs, :indexed => true
|
532
446
|
display "Selected logs: ",false
|
533
447
|
file = file.split(' ')
|
@@ -541,19 +455,43 @@ module PI::Cli::Command
|
|
541
455
|
|
542
456
|
private
|
543
457
|
|
544
|
-
def
|
545
|
-
app
|
546
|
-
|
458
|
+
def app_exists?(target, appname)
|
459
|
+
app = client.app_search(target,appname)
|
460
|
+
app[:id] != 0 ? true : false
|
547
461
|
end
|
548
462
|
|
549
|
-
def
|
550
|
-
|
551
|
-
|
463
|
+
def env_exists?(appid, envname)
|
464
|
+
env = client.env_verify(appid, envname)
|
465
|
+
"true" == env[1] ? false : true
|
552
466
|
end
|
553
467
|
|
554
|
-
def
|
555
|
-
|
556
|
-
|
468
|
+
def do_start_app(app)
|
469
|
+
display "Starting application '#{app[:name]}'(target:#{app[:targetName]}): ",false
|
470
|
+
t = Thread.new do
|
471
|
+
loop do
|
472
|
+
display '.', false
|
473
|
+
sleep (1)
|
474
|
+
break unless t.alive?
|
475
|
+
end
|
476
|
+
end
|
477
|
+
client.start_app(app[:id])
|
478
|
+
result = check_status(app[:targetName], app[:name], "start")
|
479
|
+
Thread.kill(t)
|
480
|
+
if result[:code] == 200
|
481
|
+
if not result[:text].empty?
|
482
|
+
display "OK".green
|
483
|
+
else
|
484
|
+
display "Please try again"
|
485
|
+
end
|
486
|
+
else
|
487
|
+
err result[:text]
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
491
|
+
def do_stop_app(app)
|
492
|
+
display "Stoping application '#{app[:name]}'(target:#{app[:targetName]}): ",false
|
493
|
+
client.stop_app(app[:id])
|
494
|
+
display "OK".green
|
557
495
|
end
|
558
496
|
|
559
497
|
def mem_choice_to_quota(mem_choice)
|