static 1.0.1 → 1.0.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 +4 -4
- data/LICENSE +5 -5
- data/Rakefile +15 -1
- data/lib/static.rb +14 -0
- data/lib/static/cli.rb +14 -0
- data/lib/static/cli/app/download.rb +14 -0
- data/lib/static/version.rb +15 -1
- data/vendor/manifests-vmc-plugin-0.6.2/Rakefile +38 -0
- data/vendor/manifests-vmc-plugin-0.6.2/lib/manifests-vmc-plugin.rb +313 -0
- data/vendor/manifests-vmc-plugin-0.6.2/lib/manifests-vmc-plugin/errors.rb +21 -0
- data/vendor/manifests-vmc-plugin-0.6.2/lib/manifests-vmc-plugin/loader.rb +31 -0
- data/vendor/manifests-vmc-plugin-0.6.2/lib/manifests-vmc-plugin/loader/builder.rb +34 -0
- data/vendor/manifests-vmc-plugin-0.6.2/lib/manifests-vmc-plugin/loader/normalizer.rb +149 -0
- data/vendor/manifests-vmc-plugin-0.6.2/lib/manifests-vmc-plugin/loader/resolver.rb +79 -0
- data/vendor/manifests-vmc-plugin-0.6.2/lib/manifests-vmc-plugin/plugin.rb +145 -0
- data/vendor/manifests-vmc-plugin-0.6.2/lib/manifests-vmc-plugin/version.rb +3 -0
- data/vendor/manifests-vmc-plugin-0.6.2/spec/manifests-vmc-plugin/loader/normalizer_spec.rb +176 -0
- data/vendor/manifests-vmc-plugin-0.6.2/spec/manifests-vmc-plugin/loader/plugin_spec.rb +365 -0
- data/vendor/manifests-vmc-plugin-0.6.2/spec/manifests-vmc-plugin_spec.rb +319 -0
- data/vendor/manifests-vmc-plugin-0.6.2/spec/spec_helper.rb +16 -0
- data/vendor/tunnel-vmc-plugin-0.2.2/helper-app/Gemfile.lock +50 -0
- metadata +28 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
data.tar.gz:
|
4
|
-
metadata.gz:
|
3
|
+
data.tar.gz: 1d0ada09d0360211b786bcf7ff9c5ef2be62787e
|
4
|
+
metadata.gz: dcca2c9b5ce9d104bd6ae2f92ac31c27d02ddde8
|
5
5
|
SHA512:
|
6
|
-
data.tar.gz:
|
7
|
-
metadata.gz:
|
6
|
+
data.tar.gz: 8c8b8c0a88deae4d41645eb58f9c279736805f26c4c420aeec6a43e1e4a3cdfb0d756172279d55b2eb3469b116d34b0040392d654dea88613eec4257ff0e232d
|
7
|
+
metadata.gz: bffcb48976513c0fd30eff1bb4752e8b55535c1d3a68f8d2798948c09b37fd92def78503074bb244dcbed2389371c93e0b85380e7feb417ca4c4344e5f1ce90f
|
data/LICENSE
CHANGED
@@ -205,9 +205,9 @@
|
|
205
205
|
SOFTWARE DISTRIBUTED WITH THE Static Cloud Command Line Client :
|
206
206
|
|
207
207
|
The Static Cloud Command Line Client includes a number of subcomponents with
|
208
|
-
separate copyright notices and license terms. Your use of the source
|
209
|
-
|
210
|
-
|
208
|
+
separate copyright notices and license terms. Your use of the source code
|
209
|
+
for the these subcomponents is subject to the terms and conditions of the
|
210
|
+
following licenses:
|
211
211
|
|
212
|
-
Apache 2.0
|
213
|
-
MIT
|
212
|
+
Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt
|
213
|
+
MIT http://www.opensource.org/licenses/mit-license.php
|
data/Rakefile
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
#
|
14
|
+
|
1
15
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
2
16
|
|
3
17
|
require "rake"
|
@@ -40,5 +54,5 @@ namespace "test" do
|
|
40
54
|
end
|
41
55
|
|
42
56
|
CLEAN.include [
|
43
|
-
'.bundle', '
|
57
|
+
'.bundle', '*.gem'
|
44
58
|
]
|
data/lib/static.rb
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
#
|
14
|
+
|
1
15
|
require "static/version"
|
2
16
|
require "static/cli"
|
3
17
|
|
data/lib/static/cli.rb
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
#
|
14
|
+
|
1
15
|
require "vmc"
|
2
16
|
require "vmc/cli"
|
3
17
|
|
@@ -1,3 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
#
|
14
|
+
|
1
15
|
require "vmc/cli/app/base"
|
2
16
|
require "pp"
|
3
17
|
|
data/lib/static/version.rb
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
#
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
#
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
# See the License for the specific language governing permissions and
|
12
|
+
# limitations under the License.
|
13
|
+
#
|
14
|
+
|
1
15
|
module Static
|
2
16
|
module Cmd
|
3
|
-
VERSION = "1.0.
|
17
|
+
VERSION = "1.0.3".freeze
|
4
18
|
end
|
5
19
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
5
|
+
require "manifests-vmc-plugin/version"
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
8
|
+
task :default => :spec
|
9
|
+
|
10
|
+
namespace :deploy do
|
11
|
+
def last_staging_sha
|
12
|
+
`git rev-parse latest-staging`.strip
|
13
|
+
end
|
14
|
+
|
15
|
+
def last_release_sha
|
16
|
+
`git rev-parse latest-release`.strip
|
17
|
+
end
|
18
|
+
|
19
|
+
def last_staging_ref_was_released?
|
20
|
+
last_staging_sha == last_release_sha
|
21
|
+
end
|
22
|
+
|
23
|
+
task :staging, :version do |_, args|
|
24
|
+
sh "gem bump --push #{"--version #{args.version}" if args.version}" if last_staging_ref_was_released?
|
25
|
+
sh "git tag -f latest-staging"
|
26
|
+
sh "git push origin :latest-staging"
|
27
|
+
sh "git push origin latest-staging"
|
28
|
+
end
|
29
|
+
|
30
|
+
task :gem do
|
31
|
+
sh "git fetch"
|
32
|
+
sh "git checkout #{last_staging_sha}"
|
33
|
+
sh "gem release --tag"
|
34
|
+
sh "git tag -f latest-release"
|
35
|
+
sh "git push origin :latest-release"
|
36
|
+
sh "git push origin latest-release"
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,313 @@
|
|
1
|
+
require "yaml"
|
2
|
+
require "set"
|
3
|
+
|
4
|
+
require "manifests-vmc-plugin/loader"
|
5
|
+
|
6
|
+
|
7
|
+
module VMCManifests
|
8
|
+
MANIFEST_FILE = "manifest.yml"
|
9
|
+
|
10
|
+
@@showed_manifest_usage = false
|
11
|
+
|
12
|
+
def manifest
|
13
|
+
return @manifest if @manifest
|
14
|
+
|
15
|
+
if manifest_file && File.exists?(manifest_file)
|
16
|
+
@manifest = load_manifest(manifest_file)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def save_manifest(save_to = manifest_file)
|
21
|
+
fail "No manifest to save!" unless @manifest
|
22
|
+
|
23
|
+
File.open(save_to, "w") do |io|
|
24
|
+
YAML.dump(@manifest, io)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# find the manifest file to work with
|
29
|
+
def manifest_file
|
30
|
+
return @manifest_file if @manifest_file
|
31
|
+
|
32
|
+
unless path = input[:manifest]
|
33
|
+
where = Dir.pwd
|
34
|
+
while true
|
35
|
+
if File.exists?(File.join(where, MANIFEST_FILE))
|
36
|
+
path = File.join(where, MANIFEST_FILE)
|
37
|
+
break
|
38
|
+
elsif File.basename(where) == "/"
|
39
|
+
path = nil
|
40
|
+
break
|
41
|
+
else
|
42
|
+
where = File.expand_path("../", where)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
return unless path
|
48
|
+
|
49
|
+
@manifest_file = File.expand_path(path)
|
50
|
+
end
|
51
|
+
|
52
|
+
# load and resolve a given manifest file
|
53
|
+
def load_manifest(file)
|
54
|
+
Loader.new(file, self).manifest
|
55
|
+
end
|
56
|
+
|
57
|
+
# dynamic symbol resolution
|
58
|
+
def resolve_symbol(sym)
|
59
|
+
case sym
|
60
|
+
when "target-url"
|
61
|
+
client_target
|
62
|
+
|
63
|
+
when "target-base"
|
64
|
+
target_base
|
65
|
+
|
66
|
+
when "random-word"
|
67
|
+
sprintf("%04x", rand(0x0100000))
|
68
|
+
|
69
|
+
when /^ask (.+)/
|
70
|
+
ask($1)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# find apps by an identifier, which may be either a tag, a name, or a path
|
75
|
+
def find_apps(identifier)
|
76
|
+
return [] unless manifest
|
77
|
+
|
78
|
+
apps = apps_by(:name, identifier)
|
79
|
+
|
80
|
+
if apps.empty?
|
81
|
+
apps = apps_by(:path, from_manifest(identifier))
|
82
|
+
end
|
83
|
+
|
84
|
+
apps
|
85
|
+
end
|
86
|
+
|
87
|
+
# return all the apps described by the manifest
|
88
|
+
def all_apps
|
89
|
+
manifest[:applications]
|
90
|
+
end
|
91
|
+
|
92
|
+
def current_apps
|
93
|
+
manifest[:applications].select do |app|
|
94
|
+
next unless app[:path]
|
95
|
+
from_manifest(app[:path]) == Dir.pwd
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# splits the user's input, resolving paths with the manifest,
|
100
|
+
# into internal/external apps
|
101
|
+
#
|
102
|
+
# internal apps are returned as their data in the manifest
|
103
|
+
#
|
104
|
+
# external apps are the strings that the user gave, to be
|
105
|
+
# passed along wholesale to the wrapped command
|
106
|
+
def apps_in_manifest(input = nil, use_name = true, &blk)
|
107
|
+
names_or_paths =
|
108
|
+
if input.has?(:apps)
|
109
|
+
# names may be given but be [], which will still cause
|
110
|
+
# interaction, so use #direct instead of #[] here
|
111
|
+
input.direct(:apps)
|
112
|
+
elsif input.has?(:app)
|
113
|
+
[input.direct(:app)]
|
114
|
+
elsif input.has?(:name)
|
115
|
+
[input.direct(:name)]
|
116
|
+
else
|
117
|
+
[]
|
118
|
+
end
|
119
|
+
|
120
|
+
internal = []
|
121
|
+
external = []
|
122
|
+
|
123
|
+
names_or_paths.each do |x|
|
124
|
+
if x.is_a?(String)
|
125
|
+
if x =~ %r([/\\])
|
126
|
+
apps = find_apps(File.expand_path(x))
|
127
|
+
|
128
|
+
if apps.empty?
|
129
|
+
fail("Path #{b(x)} is not present in manifest #{b(relative_manifest_file)}.")
|
130
|
+
end
|
131
|
+
else
|
132
|
+
apps = find_apps(x)
|
133
|
+
end
|
134
|
+
|
135
|
+
if !apps.empty?
|
136
|
+
internal += apps
|
137
|
+
else
|
138
|
+
external << x
|
139
|
+
end
|
140
|
+
else
|
141
|
+
external << x
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
[internal, external]
|
146
|
+
end
|
147
|
+
|
148
|
+
def create_manifest_for(app, path)
|
149
|
+
meta = {
|
150
|
+
"name" => app.name,
|
151
|
+
"framework" => app.framework.name,
|
152
|
+
"runtime" => app.runtime.name,
|
153
|
+
"memory" => human_size(app.memory * 1024 * 1024, 0),
|
154
|
+
"instances" => app.total_instances,
|
155
|
+
"url" => app.url ? app.url.sub(target_base, '${target-base}') : "none",
|
156
|
+
"path" => path
|
157
|
+
}
|
158
|
+
|
159
|
+
services = app.services
|
160
|
+
|
161
|
+
unless services.empty?
|
162
|
+
meta["services"] = {}
|
163
|
+
|
164
|
+
services.each do |i|
|
165
|
+
if v2?
|
166
|
+
p = i.service_plan
|
167
|
+
s = p.service
|
168
|
+
|
169
|
+
meta["services"][i.name] = {
|
170
|
+
"label" => s.label,
|
171
|
+
"provider" => s.provider,
|
172
|
+
"version" => s.version,
|
173
|
+
"plan" => p.name
|
174
|
+
}
|
175
|
+
else
|
176
|
+
meta["services"][i.name] = {
|
177
|
+
"vendor" => i.vendor,
|
178
|
+
"version" => i.version,
|
179
|
+
"tier" => i.tier
|
180
|
+
}
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
if cmd = app.command
|
186
|
+
meta["command"] = cmd
|
187
|
+
end
|
188
|
+
|
189
|
+
meta
|
190
|
+
end
|
191
|
+
|
192
|
+
private
|
193
|
+
|
194
|
+
def relative_manifest_file
|
195
|
+
Pathname.new(manifest_file).relative_path_from(Pathname.pwd)
|
196
|
+
end
|
197
|
+
|
198
|
+
def show_manifest_usage
|
199
|
+
return if @@showed_manifest_usage
|
200
|
+
|
201
|
+
path = relative_manifest_file
|
202
|
+
line "Using manifest file #{c(path, :name)}"
|
203
|
+
line
|
204
|
+
|
205
|
+
@@showed_manifest_usage = true
|
206
|
+
end
|
207
|
+
|
208
|
+
def no_apps
|
209
|
+
fail "No applications or manifest to operate on."
|
210
|
+
end
|
211
|
+
|
212
|
+
def warn_reset_changes
|
213
|
+
line c("Not applying manifest changes without --reset", :warning)
|
214
|
+
line "See `vmc diff` for more details."
|
215
|
+
line
|
216
|
+
end
|
217
|
+
|
218
|
+
def apps_by(attr, val)
|
219
|
+
manifest[:applications].select do |info|
|
220
|
+
info[attr] == val
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
# expand a path relative to the manifest file's directory
|
225
|
+
def from_manifest(path)
|
226
|
+
File.expand_path(path, File.dirname(manifest_file))
|
227
|
+
end
|
228
|
+
|
229
|
+
|
230
|
+
def ask_to_save(input, app)
|
231
|
+
return if manifest_file
|
232
|
+
return unless ask("Save configuration?", :default => false)
|
233
|
+
|
234
|
+
manifest = create_manifest_for(app, input[:path])
|
235
|
+
|
236
|
+
with_progress("Saving to #{c("manifest.yml", :name)}") do
|
237
|
+
File.open("manifest.yml", "w") do |io|
|
238
|
+
YAML.dump(
|
239
|
+
{ "applications" => [manifest] },
|
240
|
+
io)
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
def env_hash(val)
|
246
|
+
if val.is_a?(Hash)
|
247
|
+
val
|
248
|
+
else
|
249
|
+
hash = {}
|
250
|
+
|
251
|
+
val.each do |pair|
|
252
|
+
name, val = pair.split("=", 2)
|
253
|
+
hash[name] = val
|
254
|
+
end
|
255
|
+
|
256
|
+
hash
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def setup_env(app, info)
|
261
|
+
return unless info[:env]
|
262
|
+
app.env = env_hash(info[:env])
|
263
|
+
end
|
264
|
+
|
265
|
+
def setup_services(app, info)
|
266
|
+
return if !info[:services] || info[:services].empty?
|
267
|
+
|
268
|
+
offerings = client.services
|
269
|
+
|
270
|
+
to_bind = []
|
271
|
+
|
272
|
+
info[:services].each do |name, svc|
|
273
|
+
name = name.to_s
|
274
|
+
|
275
|
+
if instance = client.service_instance_by_name(name)
|
276
|
+
to_bind << instance
|
277
|
+
else
|
278
|
+
offering = offerings.find { |o|
|
279
|
+
o.label == (svc[:label] || svc[:type] || svc[:vendor]) &&
|
280
|
+
(!svc[:version] || o.version == svc[:version]) &&
|
281
|
+
(o.provider == (svc[:provider] || "core"))
|
282
|
+
}
|
283
|
+
|
284
|
+
fail "Unknown service offering: #{svc.inspect}." unless offering
|
285
|
+
|
286
|
+
if v2?
|
287
|
+
plan = offering.service_plans.find { |p|
|
288
|
+
p.name == (svc[:plan] || "D100")
|
289
|
+
}
|
290
|
+
|
291
|
+
fail "Unknown service plan: #{svc[:plan]}." unless plan
|
292
|
+
end
|
293
|
+
|
294
|
+
invoke :create_service,
|
295
|
+
:name => name,
|
296
|
+
:offering => offering,
|
297
|
+
:plan => plan,
|
298
|
+
:app => app
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
to_bind.each do |s|
|
303
|
+
next if app.binds?(s)
|
304
|
+
|
305
|
+
# TODO: splat
|
306
|
+
invoke :bind_service, :app => app, :service => s
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def target_base
|
311
|
+
client_target.sub(/^[^\.]+\./, "")
|
312
|
+
end
|
313
|
+
end
|