winter 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +20 -7
- data/example/Winterfile +0 -1
- data/lib/winter/cli.rb +19 -0
- data/lib/winter/dependency.rb +6 -2
- data/lib/winter/dsl.rb +6 -3
- data/lib/winter/service/build.rb +33 -6
- data/lib/winter/service/fetch.rb +76 -0
- data/lib/winter/service/start.rb +7 -1
- data/lib/winter/service/stop.rb +13 -6
- data/lib/winter/service/validate.rb +6 -1
- data/lib/winter/version.rb +1 -1
- data/spec/cli_spec.rb +25 -3
- data/winter.gemspec +3 -0
- metadata +20 -3
data/README.md
CHANGED
@@ -83,13 +83,15 @@ All commands that need a `Winterfile` will use the default filename 'Winterfile'
|
|
83
83
|
```bash
|
84
84
|
$ winter
|
85
85
|
Commands:
|
86
|
-
winter build [Winterfile]
|
87
|
-
winter
|
88
|
-
winter
|
89
|
-
winter
|
90
|
-
winter
|
91
|
-
winter
|
92
|
-
winter
|
86
|
+
winter build [Winterfile] # Build a service from a Win...
|
87
|
+
winter fetch <URL|GROUP> [artifact] [version] # Download the Winterfile an...
|
88
|
+
winter help [COMMAND] # Describe available command...
|
89
|
+
winter start [Winterfile] # Start the services in [Win...
|
90
|
+
winter status # Show status of available s...
|
91
|
+
winter stop [Winterfile] # Stop the services in [Wint...
|
92
|
+
winter validate [Winterfile] # (optional) Check the confi...
|
93
|
+
winter version # Display version information.
|
94
|
+
|
93
95
|
```
|
94
96
|
|
95
97
|
#### Build
|
@@ -105,6 +107,17 @@ Build a service from a Winterfile
|
|
105
107
|
[--debug=DEBUG] # Set log level to debug.
|
106
108
|
[--local=LOCAL] # Resolve dependencies only from local repository
|
107
109
|
|
110
|
+
#### Fetch
|
111
|
+
|
112
|
+
Download the Winterfile and configuration from a URL.
|
113
|
+
|
114
|
+
Usage:
|
115
|
+
winter fetch <URL|GROUP> [artifact] [version]
|
116
|
+
|
117
|
+
Options:
|
118
|
+
[--debug=DEBUG] # Set log level to debug.
|
119
|
+
--repos, [--repositories=REPOSITORIES] # Comma separated list of repositories to search.
|
120
|
+
|
108
121
|
#### Start
|
109
122
|
|
110
123
|
Start the services in [Winterfile]
|
data/example/Winterfile
CHANGED
data/lib/winter/cli.rb
CHANGED
@@ -18,6 +18,7 @@ require 'winter/dsl'
|
|
18
18
|
require 'winter/logger'
|
19
19
|
require 'winter/version'
|
20
20
|
require 'winter/service/build'
|
21
|
+
require 'winter/service/fetch'
|
21
22
|
require 'winter/service/start'
|
22
23
|
require 'winter/service/status'
|
23
24
|
require 'winter/service/stop'
|
@@ -88,6 +89,24 @@ module Winter
|
|
88
89
|
s.build( winterfile, options )
|
89
90
|
end
|
90
91
|
|
92
|
+
desc "fetch <URL|GROUP> [artifact] [version]", "Download the Winterfile and configuration from a URL."
|
93
|
+
method_option :debug, :desc => "Set log level to debug."
|
94
|
+
method_option :repositories, :desc => "Comma separated list of repositories to search.", :default => '', :aliases => "--repos"
|
95
|
+
def fetch( url_or_group, artifact=nil, version='LATEST' )
|
96
|
+
$LOG.level = Logger::DEBUG if options[:debug]
|
97
|
+
s = Winter::Service.new
|
98
|
+
if( url_or_group =~ /^http:/ )
|
99
|
+
s.fetch_url url_or_group
|
100
|
+
#elsif( !url_or_group.nil? && !artifact.nil? && !version.nil? )
|
101
|
+
elsif( !artifact.nil? )
|
102
|
+
repos = options[:repositories] || ''
|
103
|
+
repos = repos.split(',')
|
104
|
+
s.fetch_GAV url_or_group, artifact, version, repos
|
105
|
+
else
|
106
|
+
$LOG.error "Invalid arguments. See `winter help fetch`."
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
91
110
|
end #class
|
92
111
|
end #module
|
93
112
|
|
data/lib/winter/dependency.rb
CHANGED
@@ -39,7 +39,7 @@ module Winter
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def getMaven
|
42
|
-
dest_file = File.join(@destination,
|
42
|
+
dest_file = File.join(@destination,outputFilename)
|
43
43
|
|
44
44
|
c = "mvn org.apache.maven.plugins:maven-dependency-plugin:2.5:get "
|
45
45
|
c << " -DremoteRepositories=#{@repositories.join(',').shellescape}"
|
@@ -56,15 +56,19 @@ module Winter
|
|
56
56
|
c << " -q"
|
57
57
|
end
|
58
58
|
|
59
|
+
$LOG.debug c
|
59
60
|
result = system( c )
|
60
61
|
if result == false
|
61
|
-
$LOG.debug c
|
62
62
|
$LOG.error("Failed to retrieve artifact: #{@group}:#{@artifact}:#{@version}:#{@package}")
|
63
63
|
else
|
64
64
|
$LOG.info "#{@group}:#{@artifact}:#{@version}:#{@package}"
|
65
65
|
$LOG.debug dest_file
|
66
66
|
end
|
67
|
+
return result
|
68
|
+
end
|
67
69
|
|
70
|
+
def outputFilename
|
71
|
+
"#{@artifact}-#{@version}.#{@package}"
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
data/lib/winter/dsl.rb
CHANGED
@@ -40,6 +40,9 @@ module Winter
|
|
40
40
|
|
41
41
|
def self.evaluate( winterfile, options={} )
|
42
42
|
# Must create instance for instance_eval to have correct scope
|
43
|
+
if !File.exists?(winterfile)
|
44
|
+
raise "#{winterfile} not found."
|
45
|
+
end
|
43
46
|
dsl = DSL.new options
|
44
47
|
res = dsl.eval_winterfile winterfile
|
45
48
|
validate(res)
|
@@ -95,8 +98,8 @@ module Winter
|
|
95
98
|
dep.version = version
|
96
99
|
dep.repositories = @repositories
|
97
100
|
dep.package = options[:package] || 'jar'
|
98
|
-
dep.offline = @options['
|
99
|
-
dep.transative =
|
101
|
+
dep.offline = @options['local'] || @options['local'] == 'true'
|
102
|
+
dep.transative = false
|
100
103
|
dep.destination = File.join(Dir.getwd,RUN_DIR,@name,LIBS_DIR)
|
101
104
|
#dep.verbose = true
|
102
105
|
|
@@ -112,7 +115,7 @@ module Winter
|
|
112
115
|
dep.version = version
|
113
116
|
dep.repositories = @repositories
|
114
117
|
dep.package = options[:package] || 'jar'
|
115
|
-
dep.offline = @options['
|
118
|
+
dep.offline = @options['local'] || @options['local'] == 'true'
|
116
119
|
dep.transative = false
|
117
120
|
dep.destination = File.join(Dir.getwd,RUN_DIR,@name,BUNDLES_DIR)
|
118
121
|
#dep.verbose = true
|
data/lib/winter/service/build.rb
CHANGED
@@ -22,7 +22,12 @@ module Winter
|
|
22
22
|
|
23
23
|
def build(winterfile, options)
|
24
24
|
#dsl = DSL.new options
|
25
|
-
|
25
|
+
begin
|
26
|
+
dsl = DSL.evaluate winterfile, options
|
27
|
+
rescue Exception=>e
|
28
|
+
$LOG.error e
|
29
|
+
exit
|
30
|
+
end
|
26
31
|
dependencies = dsl[:dependencies]
|
27
32
|
service = dsl[:config]['service']
|
28
33
|
service_dir = File.join(WINTERFELL_DIR,RUN_DIR,service)
|
@@ -41,6 +46,14 @@ module Winter
|
|
41
46
|
$LOG.debug "Deleted service directory #{service_dir}"
|
42
47
|
end
|
43
48
|
end
|
49
|
+
|
50
|
+
# re-evaluate the DSL to get new dependencies
|
51
|
+
begin
|
52
|
+
dsl = DSL.evaluate winterfile, options
|
53
|
+
rescue Exception=>e
|
54
|
+
$LOG.error e
|
55
|
+
exit
|
56
|
+
end
|
44
57
|
end
|
45
58
|
end
|
46
59
|
|
@@ -58,18 +71,32 @@ module Winter
|
|
58
71
|
end while pid
|
59
72
|
end
|
60
73
|
|
74
|
+
error = false
|
61
75
|
dependencies.each do |dep|
|
62
76
|
while (active_threads >= max_threads) do
|
63
|
-
|
77
|
+
$LOG.debug "Total active threads: #{active_threads}"
|
78
|
+
#$LOG.debug "threads: #{active_threads}"
|
64
79
|
sleep 1
|
65
80
|
end
|
66
|
-
|
67
|
-
|
68
|
-
|
81
|
+
#File.join(@destination,"#{@artifact}-#{@version}.#{@package}")
|
82
|
+
if !File.exists?(File.join(dep.destination,dep.outputFilename))
|
83
|
+
active_threads += 1
|
84
|
+
fork do
|
85
|
+
result = dep.getMaven
|
86
|
+
error = true if result == false
|
87
|
+
end
|
88
|
+
else
|
89
|
+
$LOG.info "Already have #{dep.outputFilename}"
|
69
90
|
end
|
70
91
|
end
|
92
|
+
|
71
93
|
#wait for stragglers
|
72
|
-
|
94
|
+
while (active_threads > 0) do
|
95
|
+
sleep 1
|
96
|
+
$LOG.debug "threads: #{active_threads}"
|
97
|
+
end
|
98
|
+
|
99
|
+
exit 99 if error
|
73
100
|
end
|
74
101
|
end
|
75
102
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# Copyright 2013 LiveOps, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
4
|
+
# use this file except in compliance with the License. You may obtain a copy
|
5
|
+
# of the License at:
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
11
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
12
|
+
# License for the specific language governing permissions and limitations
|
13
|
+
# under the License.
|
14
|
+
|
15
|
+
require 'winter/constants'
|
16
|
+
require 'winter/logger'
|
17
|
+
require 'winter/dependency'
|
18
|
+
|
19
|
+
require 'fileutils'
|
20
|
+
|
21
|
+
module Winter
|
22
|
+
class Service
|
23
|
+
|
24
|
+
def fetch_url( url )
|
25
|
+
|
26
|
+
begin
|
27
|
+
uri = URI.parse(url)
|
28
|
+
file = uri.path.split('/').last
|
29
|
+
|
30
|
+
content = Net::HTTP.get uri
|
31
|
+
File.open(file, 'w') do |file|
|
32
|
+
file.write content
|
33
|
+
end
|
34
|
+
rescue Exception=>e
|
35
|
+
$LOG.error "Could not fetch winter configuration from : #{url}"
|
36
|
+
$LOG.debug e
|
37
|
+
end
|
38
|
+
|
39
|
+
extract_jar file
|
40
|
+
end
|
41
|
+
|
42
|
+
def fetch_GAV(group, artifact, version, repos=[])
|
43
|
+
dep = Dependency.new
|
44
|
+
dep.artifact = artifact
|
45
|
+
dep.group = group
|
46
|
+
dep.version = version
|
47
|
+
dep.repositories = repos
|
48
|
+
#dep.package = options[:package] || 'jar'
|
49
|
+
#dep.offline = @options['offline'] || @options['offline'] == 'true'
|
50
|
+
dep.transative = true
|
51
|
+
dep.destination = File.join('.')
|
52
|
+
|
53
|
+
dep.getMaven
|
54
|
+
|
55
|
+
extract_jar "#{artifact}-#{version}.jar"
|
56
|
+
end
|
57
|
+
|
58
|
+
def extract_jar( file )
|
59
|
+
begin
|
60
|
+
system "jar -xf #{file}"
|
61
|
+
rescue Exception=>e
|
62
|
+
$LOG.error "#{file} is corrupt or invalid."
|
63
|
+
$LOG.debug e
|
64
|
+
end
|
65
|
+
|
66
|
+
cleanup file
|
67
|
+
end
|
68
|
+
|
69
|
+
def cleanup(file)
|
70
|
+
File.delete(file) if File.exists?(file)
|
71
|
+
end
|
72
|
+
|
73
|
+
private :cleanup, :extract_jar
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
data/lib/winter/service/start.rb
CHANGED
@@ -43,7 +43,13 @@ module Winter
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def start(winterfile, options)
|
46
|
-
|
46
|
+
begin
|
47
|
+
dsl = DSL.evaluate winterfile, options
|
48
|
+
rescue Exception=>e
|
49
|
+
$LOG.error e
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
|
47
53
|
dsl[:dependencies].each do |dep|
|
48
54
|
$LOG.debug "dependency: #{dep.group}.#{dep.artifact}"
|
49
55
|
end
|
data/lib/winter/service/stop.rb
CHANGED
@@ -20,9 +20,14 @@ module Winter
|
|
20
20
|
|
21
21
|
# stop winterfell service
|
22
22
|
def stop(winterfile='Winterfile', options={})
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
begin
|
24
|
+
tmp = DSL.evaluate winterfile, options
|
25
|
+
config = tmp[:config]
|
26
|
+
service = config['service']
|
27
|
+
rescue Exception=>e
|
28
|
+
$LOG.error e
|
29
|
+
exit
|
30
|
+
end
|
26
31
|
|
27
32
|
@service_dir = File.join(File.split(winterfile)[0],RUN_DIR,service)
|
28
33
|
f_pid = File.join(@service_dir, "pid")
|
@@ -34,9 +39,11 @@ module Winter
|
|
34
39
|
end
|
35
40
|
|
36
41
|
begin
|
37
|
-
Process.getpgid pid
|
38
|
-
|
39
|
-
|
42
|
+
pgid = Process.getpgid pid
|
43
|
+
pgid *= -1 if !config['daemonize']
|
44
|
+
Process.kill("TERM", pgid)
|
45
|
+
rescue => e
|
46
|
+
$LOG.debug( e )
|
40
47
|
$LOG.info( "Process #{pid} does not exist. Removing pid file." )
|
41
48
|
end
|
42
49
|
|
data/lib/winter/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
@@ -17,6 +17,7 @@ SimpleCov.start
|
|
17
17
|
|
18
18
|
require 'winter'
|
19
19
|
require 'winter/cli'
|
20
|
+
require 'fileutils'
|
20
21
|
|
21
22
|
describe Winter do
|
22
23
|
|
@@ -28,6 +29,17 @@ describe Winter do
|
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
32
|
+
describe "Fetch a jar" do
|
33
|
+
it "Fetches a jar from a URL" do
|
34
|
+
begin
|
35
|
+
lambda {
|
36
|
+
cli = Winter::CLI.new
|
37
|
+
cli.fetch 'com.liveops.sample', 'winter', '1.0.0-SNAPSHOT'
|
38
|
+
}.should_not raise_error
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
31
43
|
describe "validate" do
|
32
44
|
it "Reads a local pom file" do
|
33
45
|
begin
|
@@ -54,7 +66,7 @@ describe Winter do
|
|
54
66
|
it "Build a service from a manifest" do
|
55
67
|
begin
|
56
68
|
lambda {
|
57
|
-
args = ["build", "spec/sample_data/Winterfile", "--clean"]
|
69
|
+
args = ["build", "spec/sample_data/Winterfile", "--clean", "--local"]
|
58
70
|
cli = Winter::CLI.start( args )
|
59
71
|
}.should_not raise_error
|
60
72
|
Dir["run/default/libs"].include? "maven-dependency-plugin-2.5.jar"
|
@@ -65,12 +77,20 @@ describe Winter do
|
|
65
77
|
|
66
78
|
describe 'start and stop a service : ' do
|
67
79
|
context "start, status and stop " do
|
80
|
+
before "build service to get artifacts." do
|
81
|
+
lambda {
|
82
|
+
args = ["build", "spec/sample_data/Winterfile", "--clean", "--local"]
|
83
|
+
cli = Winter::CLI.start( args )
|
84
|
+
}.should_not raise_error
|
85
|
+
end
|
86
|
+
|
68
87
|
it "Start, status and stop a service" do
|
69
88
|
begin
|
70
89
|
Dir.chdir(File.split("spec/sample_data/Winterfile")[0]) do
|
71
90
|
lambda {
|
72
|
-
Winter::CLI.start ["start"
|
91
|
+
Winter::CLI.start ["start"]
|
73
92
|
Winter::CLI.start ["status"]
|
93
|
+
#Winter::CLI.start ["stop"]
|
74
94
|
}.should_not raise_error
|
75
95
|
#lambda {
|
76
96
|
# puts "TRYING STOP"
|
@@ -93,8 +113,10 @@ describe Winter do
|
|
93
113
|
|
94
114
|
after do
|
95
115
|
Dir.chdir(File.split("spec/sample_data/Winterfile")[0]) do
|
96
|
-
Winter::CLI.start ["stop"]
|
116
|
+
#Winter::CLI.start ["stop"]
|
97
117
|
end
|
118
|
+
|
119
|
+
FileUtils.rm_r( "spec/sample_data/run" )
|
98
120
|
end
|
99
121
|
end
|
100
122
|
|
data/winter.gemspec
CHANGED
@@ -18,6 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features|coverage)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.required_ruby_version = '>= 1.9.1'
|
22
|
+
|
23
|
+
spec.add_runtime_dependency "thor", "~> 0.18.0"
|
21
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
25
|
spec.add_development_dependency "rake"
|
23
26
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: winter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-01-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: thor
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.18.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.18.0
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: bundler
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -74,6 +90,7 @@ files:
|
|
74
90
|
- lib/winter/dsl.rb
|
75
91
|
- lib/winter/logger.rb
|
76
92
|
- lib/winter/service/build.rb
|
93
|
+
- lib/winter/service/fetch.rb
|
77
94
|
- lib/winter/service/start.rb
|
78
95
|
- lib/winter/service/status.rb
|
79
96
|
- lib/winter/service/stop.rb
|
@@ -101,7 +118,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
118
|
requirements:
|
102
119
|
- - ! '>='
|
103
120
|
- !ruby/object:Gem::Version
|
104
|
-
version:
|
121
|
+
version: 1.9.1
|
105
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
123
|
none: false
|
107
124
|
requirements:
|