panamax_template_validator 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 03c5deb9ecb1660cb51a5277d75ff09f57f06dfb
4
+ data.tar.gz: 37919827546114e7b6f80091e3a9c9da6a7e43df
5
+ SHA512:
6
+ metadata.gz: 055212f2c01f845e555800388475e0c33dcae747d9462ce715c368918962be4da75f3b29a224d22e2d6e12c822b89897b524404c0b9f24f4e5c644e7104683c5
7
+ data.tar.gz: a8534cb070f9f42275ea836ee48fff181f7147a931d8ddb7802cfb5d7f1fe9bc707b04450791f78d0b284b8894e7507537d5780745d0fde1e8969ecdc1b9cd9b
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in panamax_template_validator.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Alex
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # Panamax: Docker Management for Humans
2
+
3
+ [Panamax](http://panamax.io) is a containerized app creator with an open-source app marketplace hosted in GitHub. Panamax provides a friendly interface for users of Docker, Fleet & CoreOS. With Panamax, you can easily create, share, and deploy any containerized app no matter how complex it might be. Learn more at [Panamax.io](http://panamax.io) or browse the [Panamax Wiki](https://github.com/CenturyLinkLabs/panamax-ui/wiki).
4
+
5
+
6
+ # Panamax Template Validator
7
+
8
+ Validator for panamax templates. Runs a quick sanity check against .pmx files.
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'panamax_template_validator', git: 'https://github.com/CenturyLinkLabs/panamax-template-validator.git'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install panamax_template_validator
23
+
24
+ ## Usage
25
+
26
+ ##### validate a single file:
27
+ ```
28
+ PanamaxTemplateValidator.validate('/path/to/your_template.pmx')
29
+ ```
30
+
31
+ ##### validate a collection of files:
32
+ ```
33
+ PanamaxTemplateValidator.validate_file_list(['/path/to/your_template.pmx', '/path/to/another_template.pmx'])
34
+ ```
35
+
36
+ ##### validate all *.pmx files in the current working directory:
37
+
38
+ ```
39
+ PanamaxTemplateValidator.validate_repo
40
+ ```
41
+
42
+ ##### we generally create a default rake task in our template repos that our CI solution will execute, for example:
43
+
44
+ ```
45
+ # Rakefile
46
+ require 'rake'
47
+ require 'panamax_template_validator'
48
+
49
+ task :default do
50
+ PanamaxTemplateValidator.validate_repo
51
+ end
52
+ ```
53
+
54
+ ## Contributing
55
+
56
+ 1. Fork it ( https://github.com/[my-github-username]/panamax_template_validator/fork )
57
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
58
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
59
+ 4. Push to the branch (`git push origin my-new-feature`)
60
+ 5. Create a new Pull Request
@@ -0,0 +1,43 @@
1
+ require 'panamax_template_validator/version'
2
+ require 'panamax_template_validator/repo'
3
+ require 'panamax_template_validator/template_file'
4
+ require 'panamax_template_validator/template'
5
+ require 'panamax_template_validator/image'
6
+ require 'refinements/string_colorization'
7
+
8
+ using StringColorization
9
+
10
+ module PanamaxTemplateValidator
11
+ def self.validate(file)
12
+ template_file = TemplateFile.new(file)
13
+ template_file.validate
14
+
15
+ if template_file.errors.empty?
16
+ puts 'VALID!'.green
17
+ exit 0
18
+ else
19
+ exit 1
20
+ end
21
+ end
22
+
23
+ def self.validate_file_list(files)
24
+ errors = []
25
+
26
+ files.each do |file|
27
+ template_file = TemplateFile.new(file)
28
+ template_file.validate
29
+ errors += template_file.errors
30
+ end
31
+
32
+ if errors.empty?
33
+ puts 'THESE FILES ARE ALL VALID!'.green
34
+ exit 0
35
+ else
36
+ exit 1
37
+ end
38
+ end
39
+
40
+ def self.validate_repo
41
+ Repo.new.validate
42
+ end
43
+ end
@@ -0,0 +1,98 @@
1
+ require 'net/http'
2
+
3
+ module PanamaxTemplateValidator
4
+ class Image
5
+ attr_reader :errors
6
+
7
+ def initialize(image_attrs, image_names)
8
+ @image_attrs = image_attrs
9
+ @image_names = image_names
10
+ @errors = []
11
+ end
12
+
13
+ def validate
14
+ validate_presence_of('name')
15
+ validate_presence_of('source')
16
+ validate_source_exists_publicly
17
+ validate_presence_of_container_ports
18
+ validate_uniqueness_of_host_ports
19
+ validate_volumes_have_container_path
20
+ validate_presence_of_env_var
21
+ validate_presence_of_link_alias
22
+ validate_linked_service_exists
23
+ end
24
+
25
+ private
26
+
27
+ def validate_linked_service_exists
28
+ Array(@image_attrs['links']).each_with_index do |link, i|
29
+ unless @image_names.include? link['service']
30
+ @errors << "#{@image_attrs['name']}'s link ##{i + 1} is linked to a service (#{link['service']}) that does not exist in this template"
31
+ end
32
+ end
33
+ end
34
+
35
+ def validate_presence_of_link_alias
36
+ Array(@image_attrs['links']).each_with_index do |link, i|
37
+ if link['alias'].to_s == ''
38
+ @errors << "#{@image_attrs['name']}'s link ##{i + 1} does not have an alias"
39
+ end
40
+ end
41
+ end
42
+
43
+ def validate_source_exists_publicly
44
+ source = @image_attrs['source'].split(':')[0]
45
+ res1 = Net::HTTP.get_response(URI("https://registry.hub.docker.com/u/#{source}/")).code
46
+ res2 = Net::HTTP.get_response(URI("https://registry.hub.docker.com/_/#{source}/")).code
47
+
48
+ unless [res1, res2].include?('200')
49
+ @errors << "#{@image_attrs['name']}'s source does not exist publicly in the docker index"
50
+ end
51
+ end
52
+
53
+ def validate_presence_of_env_var
54
+ Array(@image_attrs['environment']).each do |env|
55
+ if env['variable'].to_s == ''
56
+ @errors << 'each environment entry should have a variable (name)'
57
+ end
58
+ end
59
+ end
60
+
61
+ def validate_volumes_have_container_path
62
+ Array(@image_attrs['volumes']).each do |vol|
63
+ if vol['container_path'].to_s == ''
64
+ @errors << 'each volume must have a container path'
65
+ end
66
+ end
67
+ end
68
+
69
+ def validate_presence_of_container_ports
70
+ Array(@image_attrs['ports']).each do |port|
71
+ if port['container_port'].to_s == ''
72
+ @errors << 'each port must have a container port'
73
+ end
74
+ end
75
+ end
76
+
77
+ def validate_uniqueness_of_host_ports
78
+ host_ports = Array(@image_attrs['ports']).map { |p| p['host_port'] }.compact
79
+
80
+ if host_ports.length != host_ports.uniq.length
81
+ @errors << 'host ports must be unique'
82
+ end
83
+ end
84
+
85
+ def validate_presence_of(key)
86
+ if @image_attrs[key].nil? || @image_attrs[key] == ''
87
+ @errors << "image: #{@image_attrs['name']}'s #{key} is required"
88
+ end
89
+ end
90
+
91
+ def validate_length_of(key, inequality, length)
92
+ return unless @image_attrs[key]
93
+ unless @image_attrs[key].length.send(inequality, length)
94
+ @errors << "image: #{@image_attrs['name']}'s #{key} should #{inequality} #{length}"
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,28 @@
1
+ require 'refinements/string_colorization'
2
+
3
+ using StringColorization
4
+
5
+ module PanamaxTemplateValidator
6
+ class Repo
7
+
8
+ def initialize
9
+ @errors = []
10
+ end
11
+
12
+ def validate
13
+ puts ' --- Validating .pmx files in working directory --- '
14
+ Dir.glob('*.pmx') do |file|
15
+ file = TemplateFile.new(file)
16
+ file.validate
17
+ @errors += file.errors
18
+ end
19
+
20
+ if @errors.empty?
21
+ puts 'THIS REPO IS VALID!'.green
22
+ exit 0
23
+ else
24
+ exit 1
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,38 @@
1
+ module PanamaxTemplateValidator
2
+ class Template
3
+ attr_reader :errors
4
+
5
+ def initialize(template_attrs)
6
+ @template_attrs = template_attrs
7
+ @errors = []
8
+ end
9
+
10
+ def validate
11
+ validate_presence_of('name')
12
+ validate_presence_of('description')
13
+ validate_presence_of('documentation')
14
+ validate_length_of('documentation', '>', 40)
15
+ image_names = @template_attrs['images'].map { |image| image['name'] }
16
+ @template_attrs['images'].each do |image_attrs|
17
+ image = Image.new(image_attrs, image_names)
18
+ image.validate
19
+ @errors += image.errors
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def validate_presence_of(key)
26
+ if @template_attrs[key].nil? || @template_attrs[key] == ''
27
+ @errors << "template #{key} is required"
28
+ end
29
+ end
30
+
31
+ def validate_length_of(key, inequality, length)
32
+ return unless @template_attrs[key]
33
+ unless @template_attrs[key].length.send(inequality, length)
34
+ @errors << "template #{key} should #{inequality} #{length}"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,43 @@
1
+ require 'yaml'
2
+ require 'refinements/string_colorization'
3
+
4
+ using StringColorization
5
+
6
+ module PanamaxTemplateValidator
7
+ class TemplateFile
8
+
9
+ attr_reader :errors
10
+
11
+ def initialize(file)
12
+ @file = file
13
+ @errors = []
14
+ end
15
+
16
+ def validate
17
+ if template = load_template(@file)
18
+ template_validator = Template.new(template)
19
+ template_validator.validate
20
+ errors = template_validator.errors
21
+ if errors.empty?
22
+ puts "#{@file} is valid".green
23
+ else
24
+ puts "#{@file} has the following errors:".red
25
+ puts errors.map { |x| x.red }
26
+ @errors += errors
27
+ end
28
+ else
29
+ no_exist = "#{@file} does not exist"
30
+ puts no_exist
31
+ @errors << no_exist
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def load_template(path)
38
+ YAML.load_file(path)
39
+ rescue Errno::ENOENT
40
+ false
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,3 @@
1
+ module PanamaxTemplateValidator
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,16 @@
1
+ module StringColorization
2
+ refine String do
3
+ def colorize(color_code)
4
+ "\e[#{color_code}m#{self}\e[0m"
5
+ end
6
+
7
+ def red
8
+ colorize(31)
9
+ end
10
+
11
+ def green
12
+ colorize(32)
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'panamax_template_validator/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "panamax_template_validator"
8
+ spec.version = PanamaxTemplateValidator::VERSION
9
+ spec.authors = ["Centurylink Labs"]
10
+ spec.email = ["alex.welch@centurylink.com"]
11
+ spec.summary = %q{Validates panamax template files}
12
+ spec.homepage = "https://github.com/CenturyLinkLabs/panamax-template-validator"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ # spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ # spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.6"
21
+ spec.add_development_dependency "rake", "~> 10.3"
22
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: panamax_template_validator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Centurylink Labs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.3'
41
+ description:
42
+ email:
43
+ - alex.welch@centurylink.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - Gemfile
49
+ - LICENSE.txt
50
+ - README.md
51
+ - lib/panamax_template_validator.rb
52
+ - lib/panamax_template_validator/image.rb
53
+ - lib/panamax_template_validator/repo.rb
54
+ - lib/panamax_template_validator/template.rb
55
+ - lib/panamax_template_validator/template_file.rb
56
+ - lib/panamax_template_validator/version.rb
57
+ - lib/refinements/string_colorization.rb
58
+ - panamax_template_validator.gemspec
59
+ homepage: https://github.com/CenturyLinkLabs/panamax-template-validator
60
+ licenses:
61
+ - MIT
62
+ metadata: {}
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project:
79
+ rubygems_version: 2.2.2
80
+ signing_key:
81
+ specification_version: 4
82
+ summary: Validates panamax template files
83
+ test_files: []