scaltainer 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e83fe8588dcb50e60dd1b55b3fccefa1957f553b
4
- data.tar.gz: fcaca1ceaa70b6145ce7c0de83246775cfb14627
3
+ metadata.gz: 6ff62795b21afacc40d04790673b5695f0ef86cb
4
+ data.tar.gz: bc4946701f80b23c6b16976518f546fd41cc278c
5
5
  SHA512:
6
- metadata.gz: e92dad052350902b89d6a1055daea1aedbb72b217a851767008b74cc7b5ad50f14124148eeb02ed3198480f39c428cb87b142dff733033e5fc8a1f6abcb8a8a2
7
- data.tar.gz: 290abee67df29b3bde1517d4f331b6562f58064312d6406463f45f7b3f2f9fc66dbfbd23a768c4f7fc3f46521473a379dd3bbec644b2b61aa2f2e6c4e399cea2
6
+ metadata.gz: 24760c131990d3e4a7401d1ddaae1240340fb3be1df55f21ef759dc4a90fdf615864b7b4aefd763822e30f0904fe0fd2de89b386716db841fbc5723e095ea297
7
+ data.tar.gz: 157ffea30dace9c2426ebc6c7014ed2b645824be62d540eef3e72a3d68b07842a1cc132c0e62f74de39c65ddc239a845844a1bac9241041030008cf52c91294e
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  [![Build Status](https://travis-ci.org/hammady/scaltainer.svg?branch=master)](https://travis-ci.org/hammady/scaltainer)
2
2
  [![Coverage Status](https://coveralls.io/repos/github/hammady/scaltainer/badge.svg?service=github&branch=master)](https://coveralls.io/github/hammady/scaltainer?branch=master)
3
+ [![Gem Version](https://badge.fury.io/rb/scaltainer.svg)](https://badge.fury.io/rb/scaltainer)
3
4
 
4
5
  # Scaltainer
5
6
 
@@ -41,7 +42,12 @@ Example:
41
42
 
42
43
  scaltainer -f /path/to/configuration/file.yml --state-file /path/to/different/state/file.yml
43
44
 
44
- Typically, the above command should be put inside a cronjob that is triggered every minute or so.
45
+ Typically one would want to repeatedly call scaltainer every minute or so. To do this
46
+ specify the wait time between repetitions using the `-w` parameter in seconds:
47
+
48
+ scaltainer -w 60
49
+
50
+ This will repeatedly call scaltainer every 60 seconds, sleeping in between.
45
51
 
46
52
  ## Configuration
47
53
 
@@ -120,6 +126,57 @@ The configuration file (determined by `-f FILE` command line parameter) should b
120
126
 
121
127
  More details about configuration parameters can be found in [HireFire docs](https://help.hirefire.io/guides).
122
128
 
129
+ ## Docker installation and usage
130
+
131
+ Scaltainer is availabe on Docker Hub, so you can `docker run` it:
132
+
133
+ docker run -it --rm rayyanqcri/scaltainer
134
+
135
+ Which will print the usage. To add arguments, just append them:
136
+
137
+ docker run -it --rm rayyanqcri/scaltainer -f scaltainer.yml
138
+
139
+ Scaltainer should typically be run as a minutely cron service.
140
+ If you are using [rayyanqcri/swarm-scheduler](https://github.com/rayyanqcri/swarm-scheduler),
141
+ a service definition for scaltainer is typically something like this:
142
+
143
+ version: '3.3'
144
+ services:
145
+ scaltainer:
146
+ image: rayyanqcri/scaltainer:latest
147
+ command: -f /scaltainer.yml --state-file /tmp/scaltainer-state.yml
148
+ volumes:
149
+ - /var/run/docker.sock:/var/run/docker.sock
150
+ environment:
151
+ - DOCKER_URL=unix:///var/run/docker.sock
152
+ - DOCKER_SECRETS_PATH_GLOB={/run/secrets/*}
153
+ - RESPONSE_TIME_WINDOW=3
154
+ configs:
155
+ - source: scaltainer
156
+ target: /scaltainer.yml
157
+ secrets:
158
+ - scaltainer
159
+ deploy:
160
+ replicas: 0
161
+ restart_policy:
162
+ condition: none
163
+ placement:
164
+ constraints:
165
+ - node.role == manager
166
+ configs:
167
+ scaltainer:
168
+ file: scaltainer.yml
169
+ secrets:
170
+ scaltainer:
171
+ file: scaltainer.env
172
+
173
+ Where `scaltainer.env` is a file containing HireFire and NewRelic secrets:
174
+
175
+ HIREFIRE_TOKEN=
176
+ NEW_RELIC_API_KEY=
177
+
178
+ And `scaltainer.yml` is the scaltainer configuration file.
179
+
123
180
  ## Development
124
181
 
125
182
  After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/exe/scaltainer CHANGED
@@ -3,8 +3,8 @@
3
3
  require 'scaltainer'
4
4
 
5
5
  begin
6
- configfile, statefile, logger = Scaltainer::Command.parse ARGV
7
- Scaltainer::Runner.new configfile, statefile, logger
6
+ configfile, statefile, logger, wait = Scaltainer::Command.parse ARGV
7
+ Scaltainer::Runner.new configfile, statefile, logger, wait
8
8
  rescue => e
9
9
  $stderr.puts e.message
10
10
  $stderr.puts e.backtrace
@@ -4,7 +4,7 @@ require "optparse"
4
4
  module Scaltainer
5
5
  class Command
6
6
  def self.parse(args)
7
- configfile, statefile = 'scaltainer.yml', nil
7
+ configfile, statefile, wait = 'scaltainer.yml', nil, 0
8
8
  OptionParser.new do |opts|
9
9
  opts.banner = "Usage: scaltainer [options]"
10
10
  opts.on("-f", "--conf-file FILE", "Specify configuration file (default: scaltainer.yml)") do |file|
@@ -13,6 +13,9 @@ module Scaltainer
13
13
  opts.on("--state-file FILE", "Specify state file (default: <conf-file>.state)") do |file|
14
14
  statefile = file
15
15
  end
16
+ opts.on("-w", "--wait SECONDS", "Specify wait time between repeated calls, 0 for no repetition (default: 0)") do |w|
17
+ wait = w.to_i
18
+ end
16
19
  opts.on_tail("-h", "--help", "Show this message") do
17
20
  puts opts
18
21
  puts "\nEnvironment variables: \n"
@@ -35,7 +38,7 @@ module Scaltainer
35
38
  logger = Logger.new(STDOUT)
36
39
  logger.level = %w(debug info warn error fatal unknown).find_index((ENV['LOG_LEVEL'] || '').downcase) || 1
37
40
 
38
- return configfile, statefile, logger
41
+ return configfile, statefile, logger, wait
39
42
  end
40
43
 
41
44
  private
@@ -2,7 +2,7 @@ require "yaml"
2
2
 
3
3
  module Scaltainer
4
4
  class Runner
5
- def initialize(configfile, statefile, logger)
5
+ def initialize(configfile, statefile, logger, wait)
6
6
  @logger = logger
7
7
  @default_service_config = {
8
8
  "min" => 0,
@@ -16,14 +16,24 @@ module Scaltainer
16
16
  Docker.logger = @logger
17
17
  state = get_state(statefile) || {}
18
18
  endpoint = config["endpoint"]
19
- service_prefix = config["stack_name"]
20
- iterate_services config["web_services"], service_prefix, ServiceTypeWeb.new(endpoint), state
21
- iterate_services config["worker_services"], service_prefix, ServiceTypeWorker.new(endpoint), state
22
- save_state statefile, state
19
+ service_type_web = ServiceTypeWeb.new(endpoint)
20
+ service_type_worker = ServiceTypeWorker.new(endpoint)
21
+ loop do
22
+ run config, state, service_type_web, service_type_worker
23
+ save_state statefile, state
24
+ sleep wait
25
+ break if wait == 0
26
+ end
23
27
  end
24
28
 
25
29
  private
26
30
 
31
+ def run(config, state, service_type_web, service_type_worker)
32
+ service_prefix = config["stack_name"]
33
+ iterate_services config["web_services"], service_prefix, service_type_web, state
34
+ iterate_services config["worker_services"], service_prefix, service_type_worker, state
35
+ end
36
+
27
37
  def get_state(statefile)
28
38
  YAML.load_file statefile if File.exists? statefile
29
39
  end
@@ -1,3 +1,3 @@
1
1
  module Scaltainer
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scaltainer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hossam Hammady
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-13 00:00:00.000000000 Z
11
+ date: 2017-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler