puppet-forge-server 1.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 50dd26198a713585d3ff7bc041d02c6d51f3db2c
4
+ data.tar.gz: 6d2c8cdda16ba2f5fcd003b93d455737b49d89c4
5
+ SHA512:
6
+ metadata.gz: 6f1231fe9ecb57b1f9a478a4d9b3ed951a6b8c6887728600278a338841ce56fca69dae6a1736251811c7fa5dc4dcc966ca5d45aeb956639c95a533817351140a
7
+ data.tar.gz: 99947b8750cfc37c4e58da45fc68e51d44de742b67e36da7aa4e111d58984871fc7560092ad1822f7e0923eeda5074bcbaca154837b09bf33c180007b09a68c4
@@ -0,0 +1,21 @@
1
+ *.sw[op]
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .rake_t_cache
19
+ /Gemfile.lock
20
+ /.idea
21
+ /*.iml
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2014 North Development AB
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ language: ruby
18
+ rvm:
19
+ - 1.9.3
20
+ - 2.0.0
data/Gemfile ADDED
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2014 North Development AB
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+
18
+ source 'https://rubygems.org'
19
+
20
+ gemspec
@@ -0,0 +1,127 @@
1
+ # Puppet Forge Server
2
+
3
+ Private Puppet Forge Server supporting local files and both v1 and v3 API proxies. Heavily inspired by the [Puppet Library](https://github.com/drrb/puppet-library).
4
+
5
+ [![Build Status](https://api.travis-ci.org/unibet/puppet-forge-server.svg)](https://travis-ci.org/unibet/puppet-forge-server)
6
+ [![Gem Version](https://badge.fury.io/rb/puppet-forge-server.svg)](http://badge.fury.io/rb/puppet-forge-server)
7
+
8
+ Puppet Forge Server provides approximated implementation of both [v1](https://projects.puppetlabs.com/projects/module-site/wiki/Server-api)
9
+ and [v3](https://forgeapi.puppetlabs.com/) APIs, but behavioral deviations from the official implementation might occur.
10
+
11
+ ## Installation
12
+
13
+ Install the gem
14
+ ```
15
+ gem install puppet-forge-server
16
+ puppet-forge-server --help
17
+ ```
18
+ or get the latest source
19
+ ```
20
+ git clone https://github.com/unibet/puppet-forge-server
21
+ cd puppet-forge-server
22
+ bundle install
23
+ bundle exec bin/puppet-forge-server --help
24
+ ```
25
+
26
+ ## Getting Started
27
+
28
+ ### Proxy
29
+
30
+ #### Proxy the official Puppet Forge v3 API
31
+ Just start the server providing the forge URL
32
+ ```
33
+ bundle exec bin/puppet-forge-server -x https://forgeapi.puppetlabs.com
34
+ ```
35
+
36
+ Run puppet module install to test it
37
+ ```
38
+ puppet module install --module_repository=http://localhost:8080 puppetlabs-stdlib
39
+ ```
40
+
41
+ #### Proxy the official Puppet Forge v1 API and local Pulp puppet repository
42
+ Just start the server providing forge and local pulp URLs
43
+ ```
44
+ bundle exec bin/puppet-forge-server -x http://forge.puppetlabs.com -x http://my.local.pulp/pulp_puppet/forge/repository/demo
45
+ ```
46
+
47
+ Run puppet module install to test it. Please note that depending on your internet connection and puppet version it might take a while for the first call to get executed.
48
+ v3 API requires checksuming the files, which means all involved module files will be cached.
49
+ ```
50
+ puppet module install --module_repository=http://localhost:8080 puppetlabs-stdlib
51
+ ```
52
+
53
+ ### Locally stored modules
54
+
55
+ Download given modules from the official forge and start the server pointing into directory with module files
56
+ ```
57
+ mkdir modules
58
+ wget -P modules/ forge.puppetlabs.com/system/releases/p/puppetlabs/puppetlabs-apache-0.9.0.tar.gz
59
+ wget -P modules/ forge.puppetlabs.com/system/releases/p/puppetlabs/puppetlabs-concat-1.0.0.tar.gz
60
+ wget -P modules/ forge.puppetlabs.com/system/releases/p/puppetlabs/puppetlabs-stdlib-2.4.0.tar.gz
61
+ bundle exec bin/puppet-forge-server -m modules/
62
+ ```
63
+
64
+ Run puppet module install to test it
65
+ ```
66
+ puppet module install --module_repository=http://localhost:8080 puppetlabs-stdlib
67
+ ```
68
+
69
+ ### All-in
70
+
71
+ Download given modules from the official forge and start the server pointing into directory with module files and proxy URLs
72
+ ```
73
+ mkdir modules
74
+ wget -P modules/ forge.puppetlabs.com/system/releases/p/puppetlabs/puppetlabs-apache-0.9.0.tar.gz
75
+ wget -P modules/ forge.puppetlabs.com/system/releases/p/puppetlabs/puppetlabs-concat-1.0.0.tar.gz
76
+ wget -P modules/ forge.puppetlabs.com/system/releases/p/puppetlabs/puppetlabs-stdlib-2.4.0.tar.gz
77
+ bundle exec bin/puppet-forge-server -m modules/ -x https://forgeapi.puppetlabs.com -x http://my.local.pulp/pulp_puppet/forge/repository/demo
78
+ ```
79
+
80
+ Create an example Puppetfile
81
+ ```
82
+ cat > Puppetfile <<EOF
83
+ forge 'http://localhost:8080'
84
+
85
+ mod 'puppetlabs/apache'
86
+ EOF
87
+ ```
88
+
89
+ Run librarian-puppet with *--no-use-v1-api* option to instruct it to use v3 API
90
+ ```
91
+ librarian-puppet install --no-use-v1-api
92
+ ```
93
+ ## Architecture
94
+
95
+ Code is structured with MVC in mind to allow easier maintenance and readability
96
+
97
+ ### API (view)
98
+
99
+ *API* classes (actually modules only) are used to extend [Sinatra](http://www.sinatrarb.com/) application classes.
100
+ Every module corresponds to official API endpoint and used to present received model data in fasion required by the given API version.
101
+
102
+ ### App (controller)
103
+
104
+ Every *App* class is a [Sinatra](http://www.sinatrarb.com/) application class and is responsible for mapping API endpoints, querying backends for requested data and providing the results using API (view) modules.
105
+
106
+ ### Models
107
+
108
+ Puppet module *metadata* json representation is used as a main business *model*.
109
+
110
+ ### Backends
111
+
112
+ *Backend* classes are providing the means of fetching required data and creating model instances.
113
+
114
+
115
+ ## TODO
116
+
117
+ 1. Create UTs for core logic
118
+ 2. Implement *source* and *git* backends to match [puppet library](https://github.com/drrb/puppet-library) feature set
119
+
120
+ ## License
121
+
122
+ [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
123
+
124
+ ## Reference
125
+
126
+ * [Puppet Library](https://github.com/drrb/puppet-library)
127
+ * [Puppet Anvil](https://github.com/jhaals/puppet-anvil)
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Copyright 2014 North Development AB
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ $:.push File.join(File.dirname(__FILE__), '..', 'lib')
18
+
19
+ require 'puppet_forge_server'
20
+
21
+ PuppetForgeServer::Server.new.go(ARGV)
@@ -0,0 +1,63 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2014 North Development AB
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'puppet_forge_server/patches'
18
+ require 'puppet_forge_server/version'
19
+
20
+ module PuppetForgeServer
21
+ autoload :Server, 'puppet_forge_server/server'
22
+ autoload :Errors, 'puppet_forge_server/errors'
23
+
24
+ module Api
25
+ module V1
26
+ autoload :Modules, 'puppet_forge_server/api/v1/modules'
27
+ autoload :Releases, 'puppet_forge_server/api/v1/releases'
28
+ end
29
+ module V3
30
+ autoload :Modules, 'puppet_forge_server/api/v3/modules'
31
+ autoload :Releases, 'puppet_forge_server/api/v3/releases'
32
+ end
33
+ end
34
+
35
+ module App
36
+ autoload :Version1, 'puppet_forge_server/app/version1'
37
+ autoload :Version3, 'puppet_forge_server/app/version3'
38
+ end
39
+
40
+ module Backends
41
+ autoload :Directory, 'puppet_forge_server/backends/directory'
42
+ autoload :Proxy, 'puppet_forge_server/backends/proxy'
43
+ autoload :ProxyV1, 'puppet_forge_server/backends/proxy_v1'
44
+ autoload :ProxyV3, 'puppet_forge_server/backends/proxy_v3'
45
+ end
46
+
47
+ module Models
48
+ autoload :Builder, 'puppet_forge_server/models/builder'
49
+ autoload :Metadata, 'puppet_forge_server/models/metadata'
50
+ end
51
+
52
+ module Utils
53
+ autoload :Archiver, 'puppet_forge_server/utils/archiver'
54
+ autoload :OptionParser, 'puppet_forge_server/utils/option_parser'
55
+ autoload :Url, 'puppet_forge_server/utils/url'
56
+ autoload :Buffer, 'puppet_forge_server/utils/buffer'
57
+ autoload :Http, 'puppet_forge_server/utils/http'
58
+ end
59
+
60
+ module Http
61
+ autoload :HttpClient, 'puppet_forge_server/http/http_client'
62
+ end
63
+ end
@@ -0,0 +1,71 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2014 drrb
4
+ # Copyright 2014 North Development AB
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module PuppetForgeServer::Api::V1
19
+ module Modules
20
+
21
+ def get_modules(metadata)
22
+ modules = metadata.map do |element|
23
+ name = element[:metadata].name.sub(/^[^-]+-/, '')
24
+ full_name = element[:metadata].name.sub('-', '/')
25
+ {
26
+ :author => element[:metadata].author,
27
+ :full_name => full_name,
28
+ :name => name,
29
+ :desc => element[:metadata].description,
30
+ :version => element[:metadata].version,
31
+ :project_url => element[:metadata].project_page,
32
+ :releases => [{:version => element[:metadata].version}],
33
+ :tag_list => [element[:metadata].author, name]
34
+ }
35
+ end
36
+
37
+ merge_modules(modules)
38
+ end
39
+
40
+ private
41
+ def merge_modules(modules)
42
+ grouped_modules = modules.group_by do |result|
43
+ result[:full_name]
44
+ end
45
+
46
+ grouped_modules.values.map do |value|
47
+ merge_values(value)
48
+ end.flatten.uniq
49
+ end
50
+
51
+ def merge_values(value)
52
+ highest_version, tags, releases = value.inject([nil, [], []]) do |(highest_version, tags, releases), result|
53
+ [
54
+ max_version(highest_version, result[:version]),
55
+ tags + (result[:tag_list] || []),
56
+ releases + (result[:releases] || [])
57
+ ]
58
+ end
59
+
60
+ value.first.tap do |result|
61
+ result[:version] = highest_version
62
+ result[:tag_list] = tags.uniq
63
+ result[:releases] = releases.uniq.version_sort_by { |r| r[:version] }.reverse
64
+ end
65
+ end
66
+
67
+ def max_version(left, right)
68
+ [Gem::Version.new(left), Gem::Version.new(right)].max.version
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2014 North Development AB
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module PuppetForgeServer::Api::V1
18
+ module Releases
19
+ def get_releases(metadata)
20
+ metadata.map do |element|
21
+ {
22
+ :file => "/api/v1/files#{element[:path]}",
23
+ :version => element[:metadata].version,
24
+ :dependencies => element[:metadata].dependencies.map do |dependency|
25
+ [dependency['name'], dependency['version_requirement']]
26
+ end
27
+ }
28
+ end.version_sort_by { |r| r[:version] }.reverse
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,57 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2014 North Development AB
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module PuppetForgeServer::Api::V3
18
+ module Modules
19
+ include PuppetForgeServer::Api::V3::Releases
20
+
21
+ def get_modules(metadata)
22
+ modules = {}
23
+ metadata.each do |element|
24
+ if modules[element[:metadata].name]
25
+ if max_version(modules[element[:metadata].name][:current_release][:version], element[:metadata].version) == element[:metadata].version
26
+ tags = modules[element[:metadata].name][:current_release][:tags]
27
+ modules[element[:metadata].name][:current_release] = get_releases([element]).first
28
+ modules[element[:metadata].name][:current_release][:tags] = (modules[element[:metadata].name][:current_release][:tags] + tags).uniq
29
+ end
30
+ modules[element[:metadata].name][:releases] = (modules[element[:metadata].name][:releases] + releases_version(element[:metadata])).version_sort_by { |r| r[:version] }.reverse
31
+ else
32
+ name = element[:metadata].name.sub(/^[^-]+-/, '')
33
+ modules[element[:metadata].name] = {
34
+ :uri => "/v3/modules/#{element[:metadata].name}",
35
+ :name => name,
36
+ :homepage_url => element[:metadata].project_page,
37
+ :issues_url => element[:metadata].issues_url,
38
+ :releases => releases_version(element[:metadata]),
39
+ :current_release => get_releases([element]).first
40
+ }
41
+ end
42
+ end
43
+
44
+ STDERR.puts 'WARNING: Requested module count is more than 1' unless modules.values.count == 1
45
+ modules.values.first
46
+ end
47
+
48
+ private
49
+ def releases_version(metadata)
50
+ [{:version => metadata.version, :uri => "/v3/releases/#{metadata.name}-#{metadata.version}"}]
51
+ end
52
+
53
+ def max_version(left, right)
54
+ [Gem::Version.new(left), Gem::Version.new(right)].max.version
55
+ end
56
+ end
57
+ end