kongfigure 0.0.3 → 0.0.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 723613b6634757801133620d7297116b5a2b3c1fb5f6d4ac8bd6e86cc0e3abc3
4
- data.tar.gz: 0706d49ad8363ef707df443ad230d3bb80c5f3d61c0d0772ca6a0adb82a4b84d
3
+ metadata.gz: ceeaed03095ba7f32fa8239ce1f184f20c871384643279724bbab85b81707f45
4
+ data.tar.gz: f0ce60043dff56cd391c6d5800725bd267e8f752f9d1a77968ea1d246821a1df
5
5
  SHA512:
6
- metadata.gz: f9ba869ee4e68ea8659b2295989284d3811378e6cccd70369b54656a0e2b8d4cc90502437ec925b4af632d777035146ea678aef2ded4dc1dbe0378375b701648
7
- data.tar.gz: b752a3e0ac7e89b3d4906b018045bca442cb658878f017ee5822e17cc1d8292d87733efb524e1dcc82232ebe0ab4b8d33021e9d07c1511443771327e43413de0
6
+ metadata.gz: a6c0f2f1b00cb18a0f7cbf362dc75a189824de4fe89ca90e6b0ae439889b908670968d835507faee2697ff2d06679dc8994744edebd3cee096bb5ded4aab2f08
7
+ data.tar.gz: 83ce0094643344c188c7a3fbbc215160e4b0ce4e6fd5e5af0292cfd38f2287c426b74a92dd6bf14ece5aee6e98bcf9d7b354da71ce386769b6f70d984a51aa76
@@ -27,6 +27,11 @@ require_relative "kongfigure/errors/invalid_configuration.rb"
27
27
 
28
28
  require "rest-client"
29
29
  require "logger"
30
+ require "yaml"
31
+ require "erb"
32
+ require "optparse"
33
+ require "pp"
34
+ require "awesome_print"
30
35
 
31
36
  module Kongfigure
32
37
  def self.logger
@@ -38,8 +43,8 @@ module Kongfigure
38
43
  cli = Kongfigure::CLI.new
39
44
  options = cli.parse!(args)
40
45
  # Parser
41
- parser = Kongfigure::Parser.new(options[:file])
42
- http_client = Kongfigure::HTTPClient.new
46
+ parser = Kongfigure::Parser.new(options[:file], options[:debug])
47
+ http_client = Kongfigure::HTTPClient.new(parser, options[:url])
43
48
  kong = Kongfigure::Kong.new(parser, http_client)
44
49
  kong.apply!
45
50
  end
@@ -5,11 +5,19 @@ module Kongfigure
5
5
  attr_accessor :options
6
6
 
7
7
  def initialize
8
- @options = {}
8
+ @options = {
9
+ debug: false
10
+ }
9
11
  @option_parser = OptionParser.new do |parser|
10
12
  parser.on("-f", "--file FILE", "Path to the Kongfigure configuration file.") do |file|
11
13
  @options[:file] = file
12
14
  end
15
+ parser.on("-u", "--url URL", "Url to the kong admin API.") do |url|
16
+ @options[:url] = url
17
+ end
18
+ parser.on("-d", "--debug", "Debug mode.") do
19
+ @options[:debug] = true
20
+ end
13
21
  end
14
22
  end
15
23
 
@@ -1,14 +1,10 @@
1
- require "optparse"
2
- require "pp"
3
- require "awesome_print"
4
-
5
1
  module Kongfigure
6
2
  class Configuration
7
3
 
8
- attr_accessor :host, :services, :consumers, :plugins, :upstreams
4
+ attr_accessor :url, :services, :consumers, :plugins, :upstreams
9
5
 
10
6
  def initialize
11
- @host = nil
7
+ @url = nil
12
8
  @services = []
13
9
  @consumers = []
14
10
  @plugins = []
@@ -9,11 +9,11 @@ module Kongfigure
9
9
  accept_encoding: "gzip"
10
10
  }
11
11
 
12
- def initialize
12
+ def initialize(parser, url)
13
13
  @configuration = {
14
14
  ssl_ca_path: nil,
15
15
  verify_ssl: OpenSSL::SSL::VERIFY_NONE,
16
- url: "https://localhost:8445"
16
+ url: url || parser.parse!.url
17
17
  }
18
18
  @inflector = Dry::Inflector.new
19
19
  end
@@ -41,7 +41,7 @@ module Kongfigure
41
41
  private
42
42
 
43
43
  def execute(options)
44
- RestClient::Request.execute(options) do |response, _request, _result|
44
+ RestClient::Request.execute(options) do |response, request, _result|
45
45
  handle_response(response)
46
46
  end
47
47
  end
@@ -54,10 +54,12 @@ module Kongfigure
54
54
  end
55
55
 
56
56
  def request_options(method, path, payload = nil)
57
+ uri = URI.join(@configuration[:url], path)
58
+ uri.query = [uri.query, "size=1000"].compact.join("&")
57
59
  opts = {
58
60
  method: method,
59
- url: "#{@configuration[:url]}/#{path}",
60
- headers: HTTP_HEADERS,
61
+ url: uri.to_s,
62
+ headers: HTTP_HEADERS
61
63
  }
62
64
 
63
65
  opts.merge!(ssl_options) if @configuration[:url].include?("https://")
@@ -81,7 +83,7 @@ module Kongfigure
81
83
  elsif response.code == 404
82
84
  raise Kongfigure::Errors::ResourceNotFound
83
85
  elsif response.code == 409
84
- raise Kongfigure::Errors::ResourceConflict
86
+ #raise Kongfigure::Errors::ResourceConflict
85
87
  elsif response.code == 500
86
88
  raise Kongfigure::Errors::InternalServerError
87
89
  end
@@ -1,19 +1,21 @@
1
- require "yaml"
2
-
3
1
  module Kongfigure
4
2
  class Parser
5
3
 
6
- def initialize(file)
7
- @yaml_configuration = File.read(file)
8
- @configuration = Kongfigure::Configuration.new
4
+ def initialize(file, debug=false)
5
+ @yaml_erb_configuration = File.read(file)
6
+ @debug = debug
9
7
  end
10
8
 
11
9
  def parse!
10
+ return @configuration unless @configuration.nil?
11
+ @configuration = Kongfigure::Configuration.new
12
12
  puts "Parsing YAML configuration...".colorize(:color => :white, :background => :red)
13
- YAML.load(@yaml_configuration).each do |key, value|
13
+ parsed_configuration = YAML.load(ERB.new(@yaml_erb_configuration).result)
14
+ ap parsed_configuration if @debug
15
+ parsed_configuration.each do |key, value|
14
16
  case key
15
- when "host"
16
- @configuration.host = value
17
+ when "url"
18
+ @configuration.url = value
17
19
  when "services"
18
20
  @configuration.add_services(value || [])
19
21
  when "consumers"
@@ -30,8 +30,16 @@ module Kongfigure::Resources
30
30
  name
31
31
  end
32
32
 
33
- def has_route?(route)
34
- routes && routes.include?(route)
33
+ def has_route?(other_route)
34
+ routes && routes.find do |route|
35
+ other_route == route
36
+ end
37
+ end
38
+
39
+ def has_routes?(other_routes)
40
+ other_routes.reject do |other_route|
41
+ has_route?(other_route)
42
+ end.size == 0
35
43
  end
36
44
 
37
45
  def api_attributes
@@ -35,36 +35,36 @@ module Kongfigure::Services
35
35
 
36
36
  def create_or_update(http_client, resource, remote_resources)
37
37
  handle_api_errors do
38
- related_resource = find_related_resource(resource, remote_resources)
39
- if related_resource && need_update?(resource, related_resource)
38
+ related_remote_resource = find_related_resource(resource, remote_resources)
39
+ if related_remote_resource && need_update?(resource, related_remote_resource)
40
40
  puts "-> Update #{resource.class.name} (#{resource.identifier}).".colorize(:light_blue)
41
- update(http_client, resource, related_resource)
42
- elsif related_resource && need_update_dependencies?(resource, related_resource)
41
+ update(http_client, resource, related_remote_resource)
42
+ elsif related_remote_resource && need_update_dependencies?(resource, related_remote_resource)
43
43
  puts "-> Update dependencies #{resource.class.name} (#{resource.identifier}).".colorize(:light_blue)
44
- update_dependencies(http_client, resource, related_resource)
45
- elsif related_resource
44
+ update_dependencies(http_client, resource, related_remote_resource)
45
+ elsif related_remote_resource
46
46
  #noop
47
47
  else
48
48
  puts "-> Create #{resource.class.name} (#{resource.identifier}).".colorize(:green)
49
- create(http_client, resource, related_resource)
49
+ create(http_client, resource, related_remote_resource)
50
50
  end
51
51
  end
52
52
  end
53
53
 
54
- def create(http_client, resource, related_resource)
54
+ def create(http_client, resource, _related_remote_resource)
55
55
  module_name = Kongfigure::Resources.const_get(self.class.to_s.split("::").last)
56
56
  data = http_client.post("#{resource_name}", resource.api_attributes.to_json)
57
57
  create_dependencies(http_client, resource, module_name.build(data))
58
58
  end
59
59
 
60
- def update(http_client, resource, related_resource)
61
- http_client.put("#{resource_name}/#{related_resource.id}", resource.api_attributes.to_json) if need_update?(resource, related_resource)
62
- update_dependencies(http_client, resource, related_resource)
60
+ def update(http_client, resource, related_remote_resource)
61
+ http_client.put("#{resource_name}/#{related_remote_resource.id}", resource.api_attributes.to_json) if need_update?(resource, related_remote_resource)
62
+ update_dependencies(http_client, resource, related_remote_resource)
63
63
  end
64
64
 
65
- def cleanup(http_client, resource, related_resource)
66
- puts "-> Cleanup #{related_resource.class.name} (#{related_resource.identifier}).".colorize(:magenta)
67
- http_client.delete("#{resource_name}/#{related_resource.id}")
65
+ def cleanup(http_client, resource, related_remote_resource)
66
+ puts "-> Cleanup #{related_remote_resource.class.name} (#{related_remote_resource.identifier}).".colorize(:magenta)
67
+ http_client.delete("#{resource_name}/#{related_remote_resource.id}")
68
68
  end
69
69
 
70
70
  def cleanup_useless_resources(http_client, local_resources, remote_resources)
@@ -72,7 +72,6 @@ module Kongfigure::Services
72
72
  related_local_resource = find_related_resource(remote_resource, local_resources)
73
73
  handle_api_errors do
74
74
  if need_cleanup_dependencies?(related_local_resource, remote_resource)
75
-
76
75
  cleanup_dependencies(http_client, related_local_resource, remote_resource)
77
76
  end
78
77
  unless related_local_resource
@@ -96,33 +95,33 @@ module Kongfigure::Services
96
95
  end
97
96
  end
98
97
 
99
- def need_update?(resource, related_resource)
100
- resource != related_resource
98
+ def need_update?(resource, related_remote_resource)
99
+ resource != related_remote_resource
101
100
  end
102
101
 
103
- def need_update_dependencies?(resource, related_resource)
104
- need_update_plugins?(resource, related_resource)
102
+ def need_update_dependencies?(resource, related_remote_resource)
103
+ need_update_plugins?(resource, related_remote_resource)
105
104
  end
106
105
 
107
- def need_cleanup_dependencies?(resource, related_resource)
108
- resource.nil? || need_cleanup_plugins?(resource, related_resource)
106
+ def need_cleanup_dependencies?(resource, related_remote_resource)
107
+ resource.nil? || need_cleanup_plugins?(resource, related_remote_resource)
109
108
  end
110
109
 
111
110
  def has_plugins?(resource)
112
111
  resource.plugins && resource.plugins.size > 0
113
112
  end
114
113
 
115
- def update_dependencies(http_client, local_resource, remote_resource)
116
- create_plugins(http_client, local_resource, remote_resource)
114
+ def update_dependencies(http_client, local_resource, related_remote_resource)
115
+ create_or_update_plugins(http_client, local_resource, related_remote_resource)
117
116
  end
118
117
 
119
- def create_dependencies(http_client, local_resource, remote_resource)
120
- create_plugins(http_client, local_resource, remote_resource)
118
+ def create_dependencies(http_client, local_resource, related_remote_resource)
119
+ create_or_update_plugins(http_client, local_resource, related_remote_resource)
121
120
  end
122
121
 
123
- def cleanup_dependencies(http_client, local_resource, remote_resource)
124
- puts "-> Cleanup dependencies #{remote_resource.class.name} (#{remote_resource.identifier}).".colorize(:magenta)
125
- cleanup_plugins(http_client, local_resource, remote_resource)
122
+ def cleanup_dependencies(http_client, local_resource, related_remote_resource)
123
+ puts "-> Cleanup dependencies #{related_remote_resource.class.name} (#{related_remote_resource.identifier}).".colorize(:magenta)
124
+ cleanup_plugins(http_client, local_resource, related_remote_resource)
126
125
  end
127
126
 
128
127
  def handle_api_errors(&block)
@@ -133,21 +132,26 @@ module Kongfigure::Services
133
132
  end
134
133
  end
135
134
 
136
- def need_update_plugins?(resource, related_resource)
135
+ def need_update_plugins?(resource, related_remote_resource)
137
136
  resource.plugins.reject do |plugin|
138
- find_related_resource(plugin, related_resource.plugins)
137
+ related_plugin = find_related_resource(plugin, related_remote_resource.plugins)
138
+ related_plugin && plugin == related_plugin
139
139
  end.size != 0
140
140
  end
141
141
 
142
- def need_cleanup_plugins?(resource, related_resource)
142
+ def need_cleanup_plugins?(resource, related_remote_resource)
143
143
  resource.plugins.reject do |plugin|
144
- find_related_resource(plugin, related_resource.plugins)
145
- end.size == 0 && resource.plugins.size < related_resource.plugins.size
144
+ related_remote_plugin = find_related_resource(plugin, related_remote_resource.plugins)
145
+ related_remote_plugin && plugin == related_remote_plugin
146
+ end.size == 0 && resource.plugins.size < related_remote_resource.plugins.size
146
147
  end
147
148
 
148
- def create_plugins(http_client, local_resource, remote_resource)
149
+ def create_or_update_plugins(http_client, local_resource, remote_resource)
149
150
  local_resource.plugins.each do |plugin|
150
- unless find_related_resource(plugin, remote_resource.plugins)
151
+ related_plugin = find_related_resource(plugin, remote_resource.plugins)
152
+ if related_plugin
153
+ http_client.patch("#{resource_name}/#{local_resource.identifier}/plugins/#{related_plugin.id}", plugin.api_attributes.to_json)
154
+ else
151
155
  http_client.post("#{resource_name}/#{local_resource.identifier}/plugins", plugin.api_attributes.to_json)
152
156
  end
153
157
  end
@@ -155,7 +159,7 @@ module Kongfigure::Services
155
159
 
156
160
  def cleanup_plugins(http_client, local_resource, remote_resource)
157
161
  remote_resource.plugins.each do |plugin|
158
- unless find_related_resource(plugin, local_resource.plugins)
162
+ if local_resource.nil? || find_related_resource(plugin, local_resource.plugins).nil?
159
163
  http_client.delete("#{resource_name}/#{remote_resource.identifier}/plugins/#{plugin.id}")
160
164
  end
161
165
  end
@@ -43,7 +43,7 @@ module Kongfigure::Services
43
43
 
44
44
  def cleanup_key_auths(http_client, local_resource, remote_resource)
45
45
  remote_resource.key_auths.each do |remote_resource_key_auth|
46
- unless local_resource.has_key_auth?(remote_resource_key_auth)
46
+ unless local_resource && local_resource.has_key_auth?(remote_resource_key_auth)
47
47
  http_client.delete("#{resource_name}/#{remote_resource.identifier}/key-auth/#{remote_resource_key_auth.id}")
48
48
  end
49
49
  end
@@ -51,7 +51,7 @@ module Kongfigure::Services
51
51
 
52
52
  def cleanup_acls(http_client, local_resource, remote_resource)
53
53
  remote_resource.acls.each do |remote_resource_acl|
54
- unless local_resource.has_acl?(remote_resource_acl)
54
+ unless local_resource && local_resource.has_acl?(remote_resource_acl)
55
55
  http_client.delete("#{resource_name}/#{remote_resource.identifier}/acls/#{remote_resource_acl.id}")
56
56
  end
57
57
  end
@@ -11,7 +11,7 @@ module Kongfigure::Services
11
11
 
12
12
  def cleanup(http_client, resource, related_resource)
13
13
  return unless related_resource.is_global?
14
- puts "-> Cleanup #{remote_resource.class.name} (#{remote_resource.identifier}).".colorize(:magenta)
14
+ puts "-> Cleanup #{related_resource.class.name} (#{related_resource.identifier}).".colorize(:magenta)
15
15
  http_client.delete("#{resource_name}/#{related_resource.id}")
16
16
  end
17
17
  end
@@ -1,34 +1,34 @@
1
1
  module Kongfigure::Services
2
2
  class Service < Base
3
- def create_dependencies(http_client, resource, related_resource)
4
- super(http_client, resource, related_resource)
5
- create_routes(http_client, resource, related_resource)
3
+ def create_dependencies(http_client, resource, related_remote_resource)
4
+ create_routes(http_client, resource, related_remote_resource)
5
+ super(http_client, resource, related_remote_resource)
6
6
  end
7
7
 
8
- def update_dependencies(http_client, resource, related_resource)
9
- super(http_client, resource, related_resource)
10
- create_routes(http_client, resource, related_resource)
8
+ def update_dependencies(http_client, resource, related_remote_resource)
9
+ create_routes(http_client, resource, related_remote_resource)
10
+ super(http_client, resource, related_remote_resource)
11
11
  end
12
12
 
13
- def cleanup_dependencies(http_client, resource, related_resource)
14
- super(http_client, resource, related_resource)
15
- cleanup_routes(http_client, resource, related_resource)
13
+ def cleanup_dependencies(http_client, resource, related_remote_resource)
14
+ super(http_client, resource, related_remote_resource)
15
+ cleanup_routes(http_client, resource, related_remote_resource)
16
16
  end
17
17
 
18
- def need_cleanup_dependencies?(resource, related_resource)
19
- super(resource, related_resource) || resource.nil? || resource.routes != related_resource.routes
18
+ def need_cleanup_dependencies?(resource, related_remote_resource)
19
+ super(resource, related_remote_resource) || resource.nil? || resource.routes != related_remote_resource.routes
20
20
  end
21
21
 
22
- def need_update_dependencies?(resource, related_resource)
23
- super(resource, related_resource) || (resource && (resource.routes != related_resource.routes))
22
+ def need_update_dependencies?(resource, related_remote_resource)
23
+ super(resource, related_remote_resource) || (resource && !related_remote_resource.has_routes?(resource.routes))
24
24
  end
25
25
 
26
26
  private
27
27
 
28
- def create_routes(http_client, resource, related_resource)
28
+ def create_routes(http_client, resource, related_remote_resource)
29
29
  resource.routes.each do |route|
30
- unless related_resource.has_route?(route)
31
- http_client.post("#{resource_name}/#{related_resource.identifier}/routes", route.api_attributes.to_json)
30
+ unless related_remote_resource.has_route?(route)
31
+ http_client.post("#{resource_name}/#{related_remote_resource.identifier}/routes", route.api_attributes.to_json)
32
32
  end
33
33
  end
34
34
  end
@@ -44,7 +44,7 @@ module Kongfigure::Services
44
44
  end
45
45
  # cleanup useless routes
46
46
  remote_resource.routes.each do |remote_resource_route|
47
- unless local_resource.has_route?(remote_resource_route)
47
+ if local_resource.nil? || !local_resource.has_route?(remote_resource_route)
48
48
  http_client.delete("routes/#{remote_resource_route.id}")
49
49
  end
50
50
  end
@@ -1,3 +1,3 @@
1
1
  module Kongfigure
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.8"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kongfigure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ibanity
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-06 00:00:00.000000000 Z
11
+ date: 2020-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -148,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
148
  - !ruby/object:Gem::Version
149
149
  version: '0'
150
150
  requirements: []
151
- rubygems_version: 3.0.1
151
+ rubygems_version: 3.0.3
152
152
  signing_key:
153
153
  specification_version: 4
154
154
  summary: Kongfigure.