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 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] # Build a service from a Winterfile
87
- winter help [COMMAND] # Describe available commands or one specific...
88
- winter start [Winterfile] # Start the services in [Winterfile]
89
- winter status # Show status of available services
90
- winter stop [Winterfile] # Stop the services in [Winterfile]
91
- winter validate [Winterfile] # (optional) Check the configuration files
92
- winter version # Display version information.
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
@@ -1,6 +1,5 @@
1
1
  name "osgi_sample"
2
2
 
3
- repo "~/.m2/repository"
4
3
  repo "http://artifactory:8081/artifactory/"
5
4
 
6
5
  read "conf/default/wf_config.json"
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
 
@@ -39,7 +39,7 @@ module Winter
39
39
  end
40
40
 
41
41
  def getMaven
42
- dest_file = File.join(@destination,"#{@artifact}-#{@version}.#{@package}")
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['offline'] || @options['offline'] == 'true'
99
- dep.transative = true
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['offline'] || @options['offline'] == 'true'
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
@@ -22,7 +22,12 @@ module Winter
22
22
 
23
23
  def build(winterfile, options)
24
24
  #dsl = DSL.new options
25
- dsl = DSL.evaluate winterfile, options
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
- #puts "Total active threads: #{active_threads}"
77
+ $LOG.debug "Total active threads: #{active_threads}"
78
+ #$LOG.debug "threads: #{active_threads}"
64
79
  sleep 1
65
80
  end
66
- active_threads += 1
67
- fork do
68
- dep.getMaven
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
- sleep 1 while (active_threads > 0)
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
@@ -43,7 +43,13 @@ module Winter
43
43
  end
44
44
 
45
45
  def start(winterfile, options)
46
- dsl = DSL.evaluate winterfile, options
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
@@ -20,9 +20,14 @@ module Winter
20
20
 
21
21
  # stop winterfell service
22
22
  def stop(winterfile='Winterfile', options={})
23
- tmp = DSL.evaluate winterfile, options
24
- config = tmp[:config]
25
- service = config['service']
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
- Process.kill("TERM", -Process.getpgid(pid))
39
- rescue
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
 
@@ -19,7 +19,12 @@ module Winter
19
19
  class Service
20
20
 
21
21
  def validate( winterfile='Winterfile', options={} )
22
- DSL.evaluate winterfile, options
22
+ begin
23
+ DSL.evaluate winterfile, options
24
+ rescue Exception=>e
25
+ $LOG.error e
26
+ exit
27
+ end
23
28
  end
24
29
 
25
30
  end
@@ -13,5 +13,5 @@
13
13
  # under the License.
14
14
 
15
15
  module Winter
16
- VERSION = "0.0.2"
16
+ VERSION = "0.0.3"
17
17
  end
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" , "--debug"]
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.2
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: 2013-10-08 00:00:00.000000000 Z
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: '0'
121
+ version: 1.9.1
105
122
  required_rubygems_version: !ruby/object:Gem::Requirement
106
123
  none: false
107
124
  requirements: