vmc 0.3.15 → 0.3.16.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- data/config/clients.yml +7 -5
- data/lib/cli/commands/admin.rb +2 -2
- data/lib/cli/commands/apps.rb +414 -380
- data/lib/cli/commands/base.rb +162 -9
- data/lib/cli/commands/manifest.rb +56 -0
- data/lib/cli/commands/services.rb +5 -6
- data/lib/cli/commands/user.rb +1 -1
- data/lib/cli/config.rb +17 -9
- data/lib/cli/manifest_helper.rb +238 -0
- data/lib/cli/runner.rb +24 -10
- data/lib/cli/tunnel_helper.rb +36 -11
- data/lib/cli/version.rb +1 -1
- data/lib/cli.rb +2 -0
- data/lib/vmc/client.rb +29 -19
- data/lib/vmc/const.rb +7 -7
- metadata +29 -13
data/lib/cli/tunnel_helper.rb
CHANGED
@@ -34,6 +34,15 @@ module VMC::Cli
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
def tunnel_auth
|
38
|
+
tunnel_app_info[:env].each do |e|
|
39
|
+
name, val = e.split("=", 2)
|
40
|
+
return val if name == "CALDECOTT_AUTH"
|
41
|
+
end
|
42
|
+
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
|
37
46
|
def tunnel_url
|
38
47
|
return @tunnel_url if @tunnel_url
|
39
48
|
|
@@ -96,7 +105,7 @@ module VMC::Cli
|
|
96
105
|
response = nil
|
97
106
|
10.times do
|
98
107
|
begin
|
99
|
-
response = RestClient.get("
|
108
|
+
response = RestClient.get(tunnel_url + "/" + VMC::Client.path("services", service), "Auth-Token" => token)
|
100
109
|
break
|
101
110
|
rescue RestClient::Exception
|
102
111
|
sleep 1
|
@@ -201,12 +210,21 @@ module VMC::Cli
|
|
201
210
|
begin
|
202
211
|
TCPSocket.open('localhost', port)
|
203
212
|
port += 1
|
204
|
-
rescue
|
213
|
+
rescue
|
205
214
|
return port
|
206
215
|
end
|
207
216
|
end
|
208
217
|
|
209
|
-
|
218
|
+
grab_ephemeral_port
|
219
|
+
end
|
220
|
+
|
221
|
+
def grab_ephemeral_port
|
222
|
+
socket = TCPServer.new('0.0.0.0', 0)
|
223
|
+
socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
|
224
|
+
Socket.do_not_reverse_lookup = true
|
225
|
+
port = socket.addr[1]
|
226
|
+
socket.close
|
227
|
+
return port
|
210
228
|
end
|
211
229
|
|
212
230
|
def wait_for_tunnel_start(port)
|
@@ -247,16 +265,23 @@ module VMC::Cli
|
|
247
265
|
end
|
248
266
|
end
|
249
267
|
|
250
|
-
def start_local_prog(
|
268
|
+
def start_local_prog(clients, command, info, port)
|
269
|
+
client = clients[File.basename(command)]
|
270
|
+
|
271
|
+
cmdline = "#{command} "
|
272
|
+
|
251
273
|
case client
|
252
274
|
when Hash
|
253
|
-
cmdline
|
275
|
+
cmdline << resolve_symbols(client["command"], info, port)
|
254
276
|
client["environment"].each do |e|
|
255
|
-
e =~ /([^=]+)=(["']?)([^"']*)\2/
|
256
|
-
|
277
|
+
if e =~ /([^=]+)=(["']?)([^"']*)\2/
|
278
|
+
ENV[$1] = resolve_symbols($3, info, port)
|
279
|
+
else
|
280
|
+
err "Invalid environment variable: #{e}"
|
281
|
+
end
|
257
282
|
end
|
258
283
|
when String
|
259
|
-
cmdline
|
284
|
+
cmdline << resolve_symbols(client, info, port)
|
260
285
|
else
|
261
286
|
err "Unknown client info: #{client.inspect}."
|
262
287
|
end
|
@@ -279,19 +304,19 @@ module VMC::Cli
|
|
279
304
|
}
|
280
305
|
)
|
281
306
|
|
282
|
-
Command::Apps.new(
|
307
|
+
Command::Apps.new(@options).send(:upload_app_bits, tunnel_appname, HELPER_APP)
|
283
308
|
|
284
309
|
invalidate_tunnel_app_info
|
285
310
|
end
|
286
311
|
|
287
312
|
def stop_caldecott
|
288
|
-
Command::Apps.new(
|
313
|
+
Command::Apps.new(@options).stop(tunnel_appname)
|
289
314
|
|
290
315
|
invalidate_tunnel_app_info
|
291
316
|
end
|
292
317
|
|
293
318
|
def start_caldecott
|
294
|
-
Command::Apps.new(
|
319
|
+
Command::Apps.new(@options).start(tunnel_appname)
|
295
320
|
|
296
321
|
invalidate_tunnel_app_info
|
297
322
|
end
|
data/lib/cli/version.rb
CHANGED
data/lib/cli.rb
CHANGED
@@ -12,6 +12,7 @@ module VMC
|
|
12
12
|
autoload :ZipUtil, "#{ROOT}/cli/zip_util"
|
13
13
|
autoload :ServicesHelper, "#{ROOT}/cli/services_helper"
|
14
14
|
autoload :TunnelHelper, "#{ROOT}/cli/tunnel_helper"
|
15
|
+
autoload :ManifestHelper, "#{ROOT}/cli/manifest_helper"
|
15
16
|
|
16
17
|
module Command
|
17
18
|
autoload :Base, "#{ROOT}/cli/commands/base"
|
@@ -20,6 +21,7 @@ module VMC
|
|
20
21
|
autoload :Misc, "#{ROOT}/cli/commands/misc"
|
21
22
|
autoload :Services, "#{ROOT}/cli/commands/services"
|
22
23
|
autoload :User, "#{ROOT}/cli/commands/user"
|
24
|
+
autoload :Manifest, "#{ROOT}/cli/commands/manifest"
|
23
25
|
end
|
24
26
|
|
25
27
|
end
|
data/lib/vmc/client.rb
CHANGED
@@ -60,11 +60,11 @@ class VMC::Client
|
|
60
60
|
# Global listing of services that are available on the target system
|
61
61
|
def services_info
|
62
62
|
check_login_status
|
63
|
-
json_get(VMC::GLOBAL_SERVICES_PATH)
|
63
|
+
json_get(path(VMC::GLOBAL_SERVICES_PATH))
|
64
64
|
end
|
65
65
|
|
66
66
|
def runtimes_info
|
67
|
-
json_get(VMC::GLOBAL_RUNTIMES_PATH)
|
67
|
+
json_get(path(VMC::GLOBAL_RUNTIMES_PATH))
|
68
68
|
end
|
69
69
|
|
70
70
|
######################################################
|
@@ -86,7 +86,7 @@ class VMC::Client
|
|
86
86
|
|
87
87
|
def update_app(name, manifest)
|
88
88
|
check_login_status
|
89
|
-
json_put(
|
89
|
+
json_put(path(VMC::APPS_PATH, name), manifest)
|
90
90
|
end
|
91
91
|
|
92
92
|
def upload_app(name, zipfile, resource_manifest=nil)
|
@@ -103,29 +103,29 @@ class VMC::Client
|
|
103
103
|
upload_data[:application] = file
|
104
104
|
end
|
105
105
|
upload_data[:resources] = resource_manifest.to_json if resource_manifest
|
106
|
-
http_post(
|
106
|
+
http_post(path(VMC::APPS_PATH, name, "application"), upload_data)
|
107
107
|
rescue RestClient::ServerBrokeConnection
|
108
108
|
retry
|
109
109
|
end
|
110
110
|
|
111
111
|
def delete_app(name)
|
112
112
|
check_login_status
|
113
|
-
http_delete(
|
113
|
+
http_delete(path(VMC::APPS_PATH, name))
|
114
114
|
end
|
115
115
|
|
116
116
|
def app_info(name)
|
117
117
|
check_login_status
|
118
|
-
json_get(
|
118
|
+
json_get(path(VMC::APPS_PATH, name))
|
119
119
|
end
|
120
120
|
|
121
121
|
def app_update_info(name)
|
122
122
|
check_login_status
|
123
|
-
json_get(
|
123
|
+
json_get(path(VMC::APPS_PATH, name, "update"))
|
124
124
|
end
|
125
125
|
|
126
126
|
def app_stats(name)
|
127
127
|
check_login_status
|
128
|
-
stats_raw = json_get(
|
128
|
+
stats_raw = json_get(path(VMC::APPS_PATH, name, "stats"))
|
129
129
|
stats = []
|
130
130
|
stats_raw.each_pair do |k, entry|
|
131
131
|
# Skip entries with no stats
|
@@ -139,20 +139,20 @@ class VMC::Client
|
|
139
139
|
|
140
140
|
def app_instances(name)
|
141
141
|
check_login_status
|
142
|
-
json_get(
|
142
|
+
json_get(path(VMC::APPS_PATH, name, "instances"))
|
143
143
|
end
|
144
144
|
|
145
145
|
def app_crashes(name)
|
146
146
|
check_login_status
|
147
|
-
json_get(
|
147
|
+
json_get(path(VMC::APPS_PATH, name, "crashes"))
|
148
148
|
end
|
149
149
|
|
150
150
|
# List the directory or download the actual file indicated by
|
151
151
|
# the path.
|
152
152
|
def app_files(name, path, instance=0)
|
153
153
|
check_login_status
|
154
|
-
|
155
|
-
url
|
154
|
+
path = path.gsub('//', '/')
|
155
|
+
url = path(VMC::APPS_PATH, name, "instances", instance, "files", path)
|
156
156
|
_, body, headers = http_get(url)
|
157
157
|
body
|
158
158
|
end
|
@@ -192,7 +192,7 @@ class VMC::Client
|
|
192
192
|
|
193
193
|
raise TargetError, "Service [#{service}] is not a valid service choice" unless service_hash
|
194
194
|
service_hash[:name] = name
|
195
|
-
json_post(VMC::SERVICES_PATH, service_hash)
|
195
|
+
json_post(path(VMC::SERVICES_PATH), service_hash)
|
196
196
|
end
|
197
197
|
|
198
198
|
def delete_service(name)
|
@@ -200,7 +200,7 @@ class VMC::Client
|
|
200
200
|
svcs = services || []
|
201
201
|
names = svcs.collect { |s| s[:name] }
|
202
202
|
raise TargetError, "Service [#{name}] not a valid service" unless names.include? name
|
203
|
-
http_delete(
|
203
|
+
http_delete(path(VMC::SERVICES_PATH, name))
|
204
204
|
end
|
205
205
|
|
206
206
|
def bind_service(service, appname)
|
@@ -270,7 +270,7 @@ class VMC::Client
|
|
270
270
|
# Auth token can be retained and used in creating
|
271
271
|
# new clients, avoiding login.
|
272
272
|
def login(user, password)
|
273
|
-
status, body, headers = json_post(
|
273
|
+
status, body, headers = json_post(path(VMC::USERS_PATH, user, "tokens"), {:password => password})
|
274
274
|
response_info = json_parse(body)
|
275
275
|
if response_info
|
276
276
|
@user = user
|
@@ -281,10 +281,10 @@ class VMC::Client
|
|
281
281
|
# sets the password for the current logged user
|
282
282
|
def change_password(new_password)
|
283
283
|
check_login_status
|
284
|
-
user_info = json_get(
|
284
|
+
user_info = json_get(path(VMC::USERS_PATH, @user))
|
285
285
|
if user_info
|
286
286
|
user_info[:password] = new_password
|
287
|
-
json_put(
|
287
|
+
json_put(path(VMC::USERS_PATH, @user), user_info)
|
288
288
|
end
|
289
289
|
end
|
290
290
|
|
@@ -311,13 +311,23 @@ class VMC::Client
|
|
311
311
|
|
312
312
|
def delete_user(user_email)
|
313
313
|
check_login_status
|
314
|
-
http_delete(
|
314
|
+
http_delete(path(VMC::USERS_PATH, user_email))
|
315
315
|
end
|
316
316
|
|
317
317
|
######################################################
|
318
318
|
|
319
|
+
def self.path(*path)
|
320
|
+
path.flatten.collect { |x|
|
321
|
+
URI.encode x, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")
|
322
|
+
}.join("/")
|
323
|
+
end
|
324
|
+
|
319
325
|
private
|
320
326
|
|
327
|
+
def path(*args, &blk)
|
328
|
+
self.class.path(*args, &blk)
|
329
|
+
end
|
330
|
+
|
321
331
|
def json_get(url)
|
322
332
|
status, body, headers = http_get(url, 'application/json')
|
323
333
|
json_parse(body)
|
@@ -370,7 +380,7 @@ class VMC::Client
|
|
370
380
|
end
|
371
381
|
|
372
382
|
req = {
|
373
|
-
:method => method, :url => "#{@target}
|
383
|
+
:method => method, :url => "#{@target}/#{path}",
|
374
384
|
:payload => payload, :headers => headers, :multipart => true
|
375
385
|
}
|
376
386
|
status, body, response_headers = perform_http_request(req)
|
data/lib/vmc/const.rb
CHANGED
@@ -9,14 +9,14 @@ module VMC
|
|
9
9
|
DEFAULT_LOCAL_TARGET = 'http://api.vcap.me'
|
10
10
|
|
11
11
|
# General Paths
|
12
|
-
INFO_PATH = '
|
13
|
-
GLOBAL_SERVICES_PATH = '
|
14
|
-
GLOBAL_RUNTIMES_PATH = '
|
15
|
-
RESOURCES_PATH = '
|
12
|
+
INFO_PATH = 'info'
|
13
|
+
GLOBAL_SERVICES_PATH = ['info', 'services']
|
14
|
+
GLOBAL_RUNTIMES_PATH = ['info', 'runtimes']
|
15
|
+
RESOURCES_PATH = 'resources'
|
16
16
|
|
17
17
|
# User specific paths
|
18
|
-
APPS_PATH = '
|
19
|
-
SERVICES_PATH = '
|
20
|
-
USERS_PATH = '
|
18
|
+
APPS_PATH = 'apps'
|
19
|
+
SERVICES_PATH = 'services'
|
20
|
+
USERS_PATH = 'users'
|
21
21
|
|
22
22
|
end
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
version: 0.3.
|
4
|
+
prerelease: 7
|
5
|
+
version: 0.3.16.beta.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- VMware
|
@@ -19,20 +19,23 @@ dependencies:
|
|
19
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
20
|
none: false
|
21
21
|
requirements:
|
22
|
-
- -
|
22
|
+
- - ">="
|
23
23
|
- !ruby/object:Gem::Version
|
24
24
|
version: 1.5.1
|
25
|
+
- - <
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 1.7.0
|
25
28
|
type: :runtime
|
26
29
|
version_requirements: *id001
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
31
|
+
name: rubyzip
|
29
32
|
prerelease: false
|
30
33
|
requirement: &id002 !ruby/object:Gem::Requirement
|
31
34
|
none: false
|
32
35
|
requirements:
|
33
36
|
- - ~>
|
34
37
|
- !ruby/object:Gem::Version
|
35
|
-
version:
|
38
|
+
version: 0.9.4
|
36
39
|
type: :runtime
|
37
40
|
version_requirements: *id002
|
38
41
|
- !ruby/object:Gem::Dependency
|
@@ -83,38 +86,49 @@ dependencies:
|
|
83
86
|
type: :runtime
|
84
87
|
version_requirements: *id006
|
85
88
|
- !ruby/object:Gem::Dependency
|
86
|
-
name:
|
89
|
+
name: uuidtools
|
87
90
|
prerelease: false
|
88
91
|
requirement: &id007 !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.1.0
|
97
|
+
type: :runtime
|
98
|
+
version_requirements: *id007
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: rake
|
101
|
+
prerelease: false
|
102
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
89
103
|
none: false
|
90
104
|
requirements:
|
91
105
|
- - ">="
|
92
106
|
- !ruby/object:Gem::Version
|
93
107
|
version: "0"
|
94
108
|
type: :development
|
95
|
-
version_requirements: *
|
109
|
+
version_requirements: *id008
|
96
110
|
- !ruby/object:Gem::Dependency
|
97
111
|
name: rspec
|
98
112
|
prerelease: false
|
99
|
-
requirement: &
|
113
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
100
114
|
none: false
|
101
115
|
requirements:
|
102
116
|
- - ~>
|
103
117
|
- !ruby/object:Gem::Version
|
104
118
|
version: 1.3.0
|
105
119
|
type: :development
|
106
|
-
version_requirements: *
|
120
|
+
version_requirements: *id009
|
107
121
|
- !ruby/object:Gem::Dependency
|
108
122
|
name: webmock
|
109
123
|
prerelease: false
|
110
|
-
requirement: &
|
124
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
111
125
|
none: false
|
112
126
|
requirements:
|
113
127
|
- - "="
|
114
128
|
- !ruby/object:Gem::Version
|
115
129
|
version: 1.5.0
|
116
130
|
type: :development
|
117
|
-
version_requirements: *
|
131
|
+
version_requirements: *id010
|
118
132
|
description: Client library and CLI that provides access to the VMware Cloud Application Platform.
|
119
133
|
email: support@vmware.com
|
120
134
|
executables:
|
@@ -132,6 +146,7 @@ files:
|
|
132
146
|
- lib/cli/commands/admin.rb
|
133
147
|
- lib/cli/commands/apps.rb
|
134
148
|
- lib/cli/commands/base.rb
|
149
|
+
- lib/cli/commands/manifest.rb
|
135
150
|
- lib/cli/commands/misc.rb
|
136
151
|
- lib/cli/commands/services.rb
|
137
152
|
- lib/cli/commands/user.rb
|
@@ -139,6 +154,7 @@ files:
|
|
139
154
|
- lib/cli/core_ext.rb
|
140
155
|
- lib/cli/errors.rb
|
141
156
|
- lib/cli/frameworks.rb
|
157
|
+
- lib/cli/manifest_helper.rb
|
142
158
|
- lib/cli/runner.rb
|
143
159
|
- lib/cli/services_helper.rb
|
144
160
|
- lib/cli/tunnel_helper.rb
|
@@ -171,9 +187,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
171
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
188
|
none: false
|
173
189
|
requirements:
|
174
|
-
- - "
|
190
|
+
- - ">"
|
175
191
|
- !ruby/object:Gem::Version
|
176
|
-
version:
|
192
|
+
version: 1.3.1
|
177
193
|
requirements: []
|
178
194
|
|
179
195
|
rubyforge_project:
|