winter 0.0.2 → 0.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.
- 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:
|