viaduct-archfile 1.0.1 → 1.1.0

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: d17b454ac6a627689305e8d342e17386eb329669
4
- data.tar.gz: 5122ab3c059cc27540e450a6624dfe89c7d66d2c
3
+ metadata.gz: 502a658bf4d86831fc2ecc3ef374d49cb3cd9a95
4
+ data.tar.gz: a79ee80a23d723efc98eb42cfce061b8ef2f2815
5
5
  SHA512:
6
- metadata.gz: 8b377d903e849995cecc5eab83a92f069778e7361a1507651732f905b8a41604faae6656eda53af5ed54200d73497f4a1633bf0aa8c3b086834b7e11fabaeaa7
7
- data.tar.gz: 1e20b690758fb2e32d04fc0f73a8fc5ee3a113bdfc198d8a698739c87a1e07602f885ccd5cc147c39d9fbc79f69b4c09ba6044c0cfbb8526043a6129500ee8d4
6
+ metadata.gz: 4f386fb0f5e89237322d10bc53b5ee5669d53b6caef840ff8dc7ef16d17d3c8d4ca6a4d8d075d10a6815d88e2ff42ccf7012e01820b5892ad00305d540da930a
7
+ data.tar.gz: 8ba2c3c562eaa9b5f9a8c15a73c082f9c549a2fc34e0c66d4c11fb9c849916474f142ff6698004d02b295ffca2e156e30214e3f6c3ce37ff11217cf88040feb8
@@ -2,27 +2,36 @@
2
2
  $:.unshift(File.expand_path('../../lib', __FILE__))
3
3
  require 'viaduct/archfile'
4
4
 
5
- path = ARGV[0] || './Archfile'
6
- if File.exist?(path)
7
- archfile = Viaduct::Archfile.new(File.read(path))
8
- errors = archfile.validate
9
- if errors.empty?
10
- puts
11
- puts " \e[32mCongratulations. That Archfile looks excellent and should work well!\e[0m"
12
- puts
13
- puts " Just head over to \e[35mhttps://my.viaduct.io\e[0m to create your new application."
14
- puts " Don't forget to add your Archfile to your repository so we can find it."
15
- puts
16
- else
17
- puts
18
- puts " \e[31mOh no. It seems there's a problem with your Archfile!\e[0m"
19
- puts
20
- errors.each do |field, value|
21
- puts " * #{field ? field + ' ' : nil}\e[33m#{value}\e[0m"
5
+ begin
6
+ path = ARGV[0] || './Archfile'
7
+ if File.exist?(path)
8
+ archfile = Viaduct::Archfile.new(File.read(path))
9
+ errors = archfile.validate
10
+ if errors.empty?
11
+ puts
12
+ puts " \e[32mCongratulations. That Archfile looks excellent and should work well!\e[0m"
13
+ puts
14
+ puts " Just head over to \e[35mhttps://my.viaduct.io\e[0m to create your new application."
15
+ puts " Don't forget to add your Archfile to your repository so we can find it."
16
+ puts
17
+ else
18
+ puts
19
+ puts " \e[31mOh no. It seems there's a problem with your Archfile!\e[0m"
20
+ puts
21
+ errors.each do |field, value|
22
+ puts " * #{field ? field + ' ' : nil}\e[33m#{value}\e[0m"
23
+ end
24
+ puts
22
25
  end
23
- puts
26
+ else
27
+ $stderr.puts "\e[31m!! Couldn't find Viaduct Archfile at #{path}\e[0m"
28
+ exit 1
24
29
  end
25
- else
26
- $stderr.puts "\e[31m!! Couldn't find Viaduct Archfile at #{path}\e[0m"
30
+ rescue Viaduct::ArchfileRemoteBackend::Error
31
+ $stderr.puts "\e[31m!! Couldn't download required data from Viaduct. Please try again later.\e[0m"
32
+ exit 1
33
+ rescue Psych::SyntaxError => e
34
+ $stderr.puts "\e[31m!! The Archfile could not be read as it was not valid YAML. Please check and try again.\e[0m"
35
+ $stderr.puts e.message
27
36
  exit 1
28
- end
37
+ end
@@ -1,21 +1,24 @@
1
1
  require 'safe_yaml/load'
2
+ require 'viaduct/archfile_remote_backend'
2
3
 
3
4
  module Viaduct
4
5
  class Archfile
5
6
 
6
- APPLICATION_STACKS = ['ruby2.0']
7
- SHARED_DATABASE_TYPES = ['mysql']
8
- START_DETECTOR_MODULES = ['none', 'log_string', 'timer']
9
- COMMAND_EVENTS = ['build', 'start', 'firstrun']
10
-
11
7
  PATH_REGEX = /\A[a-z0-9\_\-\/\.]+\z/
12
8
 
13
-
14
9
  #
15
10
  # Create a new Archfile object from raw yaml
16
11
  #
17
- def initialize(yaml)
12
+ def initialize(yaml, remote_backend = ArchfileRemoteBackend)
18
13
  @yaml = yaml
14
+ @remote_backend = remote_backend
15
+ end
16
+
17
+ #
18
+ # Return the spec document
19
+ #
20
+ def spec
21
+ @spec ||= SafeYAML.load(@yaml)
19
22
  end
20
23
 
21
24
  #
@@ -40,6 +43,13 @@ module Viaduct
40
43
  errors << [key.nil? ? nil : "#{@current_namespace.join('.')}.#{key}", message]
41
44
  end
42
45
 
46
+ #
47
+ # Return remote properties for this archfile
48
+ #
49
+ def remote_properties
50
+ @remote_properties ||= @remote_backend.properties
51
+ end
52
+
43
53
  #
44
54
  # Validate that the object is valid, returning an array of errors
45
55
  # or an empty array if there are no errors.
@@ -47,23 +57,15 @@ module Viaduct
47
57
  def validate
48
58
  @errors = []
49
59
 
50
- #
51
- # Load the YAML
52
- #
53
- begin
54
- spec = SafeYAML.load(@yaml)
55
- rescue Psych::SyntaxError => e
56
- errors << [nil, "YAML document could not be read (#{e.message})"]
57
- return @errors
58
- end
59
-
60
60
  #
61
61
  # Check settings
62
62
  #
63
- namespace spec['settings'], 'settings'
64
- ensure_boolean('sleep_inactive_web_processes')
65
- ensure_boolean('serve_static_files')
66
- ensure_matches(/\A[a-z0-9\_\-\/]+\z/, 'document_root')
63
+ if spec['settings']
64
+ namespace spec['settings'], 'settings'
65
+ ensure_boolean('sleep_inactive_web_processes') if spec['settings'].keys.include?('sleep_inactive_web_processes')
66
+ ensure_boolean('serve_static_files') if spec['settings'].keys.include?('serve_static_files')
67
+ ensure_matches(/\A[a-z0-9\_\-\/]+\z/, 'document_root') if spec['settings'].keys.include?('document_root')
68
+ end
67
69
 
68
70
  #
69
71
  # Check that we have some processes to begin with
@@ -79,13 +81,14 @@ module Viaduct
79
81
  spec['processes'].each_with_index do |process, index|
80
82
  namespace process, 'processes', index
81
83
  ensure_string('command')
82
- ensure_inclusion(APPLICATION_STACKS, 'stack')
84
+ ensure_inclusion(remote_properties['container_memory_allocations'], 'memory')
85
+ ensure_inclusion(remote_properties['application_stacks'], 'stack')
83
86
  ensure_integer('quantity')
84
87
  ensure_matches(PATH_REGEX, 'name')
85
88
  ensure_integer('kill_after') if process['kill_after']
86
89
  if sm = process['start_monitor']
87
90
  namespace sm, 'processes', index, 'start_monitor'
88
- ensure_inclusion(START_DETECTOR_MODULES, 'module')
91
+ ensure_inclusion(remote_properties['process_start_detectors'], 'module')
89
92
  ensure_integer('timer') if sm['module'] == 'timer'
90
93
  ensure_string('string') if sm['module'] == 'log_string'
91
94
  end
@@ -98,7 +101,7 @@ module Viaduct
98
101
  if spec['shared_databases'].is_a?(Array)
99
102
  spec['shared_databases'].each_with_index do |db, index|
100
103
  namespace db, 'shared_databases', index
101
- ensure_inclusion(SHARED_DATABASE_TYPES, 'type')
104
+ ensure_inclusion(remote_properties['shared_database_backends'], 'type')
102
105
  ensure_string('label')
103
106
  end
104
107
  end
@@ -129,8 +132,8 @@ module Viaduct
129
132
  if spec['commands'].is_a?(Array)
130
133
  spec['commands'].each_with_index do |command, index|
131
134
  namespace command, 'commands', index
132
- ensure_inclusion APPLICATION_STACKS, 'stack'
133
- ensure_inclusion COMMAND_EVENTS, 'event'
135
+ ensure_inclusion remote_properties['application_stacks'], 'stack'
136
+ ensure_inclusion remote_properties['command_events'], 'event'
134
137
  ensure_string 'command'
135
138
  ensure_integer 'success_exit_code'
136
139
  end
@@ -153,7 +156,7 @@ module Viaduct
153
156
  private
154
157
 
155
158
  def value_for(item)
156
- @current_hash[item]
159
+ @current_hash.is_a?(Hash) ? @current_hash[item] : nil
157
160
  end
158
161
 
159
162
  def ensure_boolean(*items)
@@ -0,0 +1,28 @@
1
+ require 'net/https'
2
+ require 'json'
3
+
4
+ module Viaduct
5
+ class ArchfileRemoteBackend
6
+
7
+ class Error < StandardError; end
8
+
9
+ def self.properties
10
+ req = Net::HTTP::Get.new('/archfile/properties')
11
+ http = Net::HTTP.new(ENV['VDT_HOST'] || 'my.viaduct.io', ENV['VDT_PORT'] || 443)
12
+ if ENV['VDT_PORT'] == 443
13
+ res.use_ssl = true
14
+ res.verify_mode = OpenSSL::SSL::VERIFY_NONE
15
+ end
16
+
17
+ result = http.request(req)
18
+ if result.is_a?(Net::HTTPSuccess)
19
+ JSON.parse(result.body)
20
+ else
21
+ raise Error, "Unable to download data from Viaduct host. Please try again later."
22
+ end
23
+ rescue
24
+ raise Error, "Unable to download data from Viaduct host. Please try again later."
25
+ end
26
+
27
+ end
28
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: viaduct-archfile
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Cooke
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.0.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.8.1
27
41
  description: A validation tool for checking the validity of a Viaduct Archfile
28
42
  email:
29
43
  - adam@viaduct.io
@@ -34,6 +48,7 @@ extra_rdoc_files: []
34
48
  files:
35
49
  - bin/vdt-archfile-check
36
50
  - lib/viaduct/archfile.rb
51
+ - lib/viaduct/archfile_remote_backend.rb
37
52
  - README.md
38
53
  homepage: http://viaduct.io
39
54
  licenses: []