kongfigure 0.0.2
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 +7 -0
- data/.gitignore +54 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +40 -0
- data/LICENSE.txt +21 -0
- data/README.md +3 -0
- data/exe/kongfigure +6 -0
- data/exe/kongfigure_local +6 -0
- data/kongfigure.gemspec +31 -0
- data/lib/kongfigure/cli.rb +21 -0
- data/lib/kongfigure/configuration.rb +51 -0
- data/lib/kongfigure/errors/bad_request.rb +4 -0
- data/lib/kongfigure/errors/internal_server_error.rb +4 -0
- data/lib/kongfigure/errors/invalid_configuration.rb +4 -0
- data/lib/kongfigure/errors/resource_conflict.rb +4 -0
- data/lib/kongfigure/errors/resource_not_found.rb +4 -0
- data/lib/kongfigure/http_client.rb +94 -0
- data/lib/kongfigure/kong.rb +40 -0
- data/lib/kongfigure/parser.rb +32 -0
- data/lib/kongfigure/resources/base.rb +48 -0
- data/lib/kongfigure/resources/consumer.rb +40 -0
- data/lib/kongfigure/resources/consumers/acl.rb +18 -0
- data/lib/kongfigure/resources/consumers/key_auth.rb +18 -0
- data/lib/kongfigure/resources/plugin.rb +51 -0
- data/lib/kongfigure/resources/route.rb +41 -0
- data/lib/kongfigure/resources/service.rb +56 -0
- data/lib/kongfigure/resources/target.rb +19 -0
- data/lib/kongfigure/resources/upstream.rb +51 -0
- data/lib/kongfigure/services/base.rb +164 -0
- data/lib/kongfigure/services/consumer.rb +60 -0
- data/lib/kongfigure/services/plugin.rb +18 -0
- data/lib/kongfigure/services/route.rb +4 -0
- data/lib/kongfigure/services/service.rb +53 -0
- data/lib/kongfigure/services/upstream.rb +41 -0
- data/lib/kongfigure/version.rb +3 -0
- data/lib/kongfigure.rb +46 -0
- metadata +155 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
require "uri"
|
2
|
+
module Kongfigure::Resources
|
3
|
+
class Service < Base
|
4
|
+
attr_accessor :name, :retries, :protocol, :host, :port, :path, :connect_timeout,
|
5
|
+
:write_timeout, :read_timeout, :url, :routes
|
6
|
+
|
7
|
+
def self.build(hash)
|
8
|
+
service = new(hash["id"], hash["kongfigure_ignore_fields"])
|
9
|
+
service.name = hash["name"]
|
10
|
+
service.retries = hash["retries"]
|
11
|
+
service.protocol = hash["protocol"]
|
12
|
+
service.host = hash["host"]
|
13
|
+
service.port = hash["port"]
|
14
|
+
service.path = hash["path"]
|
15
|
+
service.connect_timeout = hash["connect_timeout"]
|
16
|
+
service.write_timeout = hash["write_timeout"]
|
17
|
+
service.read_timeout = hash["read_timeout"]
|
18
|
+
service.plugins = Kongfigure::Resources::Plugin.build_all(hash["plugins"] || [])
|
19
|
+
service.routes = Kongfigure::Resources::Route.build_all(hash["routes"] || [])
|
20
|
+
service.url = hash["url"] || URI::Generic.build({
|
21
|
+
scheme: hash["protocol"],
|
22
|
+
host: hash["host"],
|
23
|
+
port: hash["port"],
|
24
|
+
path: hash["path"]
|
25
|
+
}).to_s
|
26
|
+
service
|
27
|
+
end
|
28
|
+
|
29
|
+
def identifier
|
30
|
+
name
|
31
|
+
end
|
32
|
+
|
33
|
+
def has_route?(route)
|
34
|
+
routes && routes.include?(route)
|
35
|
+
end
|
36
|
+
|
37
|
+
def api_attributes
|
38
|
+
{
|
39
|
+
"name" => name,
|
40
|
+
"retries" => retries,
|
41
|
+
"protocol" => protocol,
|
42
|
+
"host" => host,
|
43
|
+
"port" => port,
|
44
|
+
"path" => path,
|
45
|
+
"connect_timeout" => connect_timeout,
|
46
|
+
"write_timeout" => write_timeout,
|
47
|
+
"read_timeout" => read_timeout,
|
48
|
+
"url" => url
|
49
|
+
}.compact
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_s
|
53
|
+
name
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Kongfigure::Resources
|
2
|
+
class Target < Base
|
3
|
+
attr_accessor :target, :weight
|
4
|
+
|
5
|
+
def self.build(hash)
|
6
|
+
target = new(hash["id"], hash["kongfigure_ignore_fields"])
|
7
|
+
target.target = hash["target"]
|
8
|
+
target.weight = hash["weight"]
|
9
|
+
target
|
10
|
+
end
|
11
|
+
|
12
|
+
def api_attributes
|
13
|
+
{
|
14
|
+
"target" => target,
|
15
|
+
"weight" => weight
|
16
|
+
}.compact
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Kongfigure::Resources
|
2
|
+
class Upstream < Base
|
3
|
+
attr_accessor :name, :hash_on, :hash_fallback, :hash_on_cookie_path, :slots, :healthchecks, :targets,
|
4
|
+
:hash_fallback, :hash_on_header, :hash_fallback_header, :hash_on_cookie
|
5
|
+
|
6
|
+
def self.build(hash)
|
7
|
+
upstream = new(hash["id"], hash["kongfigure_ignore_fields"])
|
8
|
+
upstream.name = hash["name"]
|
9
|
+
upstream.hash_on = hash["hash_on"]
|
10
|
+
upstream.hash_fallback = hash["hash_fallback"]
|
11
|
+
upstream.hash_on_cookie_path = hash["hash_on_cookie_path"]
|
12
|
+
upstream.slots = hash["slots"]
|
13
|
+
upstream.healthchecks = hash["healthchecks"]
|
14
|
+
upstream.hash_on_header = hash["hash_on_header"]
|
15
|
+
upstream.hash_fallback = hash["hash_fallback"]
|
16
|
+
upstream.hash_fallback_header = hash["hash_fallback_header"]
|
17
|
+
upstream.hash_on_cookie = hash["hash_on_cookie"]
|
18
|
+
upstream.targets = Kongfigure::Resources::Target.build_all(hash["targets"] || [])
|
19
|
+
upstream
|
20
|
+
end
|
21
|
+
|
22
|
+
def identifier
|
23
|
+
name
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
if targets.size > 0
|
28
|
+
"#{name} with targets #{targets.map(&:target).join(', ')}"
|
29
|
+
else
|
30
|
+
"#{name} without target"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def api_attributes
|
35
|
+
{
|
36
|
+
"name" => name,
|
37
|
+
"hash_on" => hash_on,
|
38
|
+
"hash_fallback" => hash_fallback,
|
39
|
+
"hash_on_cookie_path" => hash_on_cookie_path,
|
40
|
+
"slots" => healthchecks,
|
41
|
+
"hash_on_header" => hash_on_header,
|
42
|
+
"hash_fallback_header" => hash_fallback_header,
|
43
|
+
"hash_on_cookie" => hash_on_cookie
|
44
|
+
}.compact
|
45
|
+
end
|
46
|
+
|
47
|
+
def has_target?(target)
|
48
|
+
targets && targets.include?(target)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require "colorize"
|
2
|
+
|
3
|
+
module Kongfigure::Services
|
4
|
+
class Base
|
5
|
+
|
6
|
+
def initialize(http_client)
|
7
|
+
@http_client = http_client
|
8
|
+
end
|
9
|
+
|
10
|
+
def resource_name
|
11
|
+
Dry::Inflector.new.pluralize(self.class.to_s.split("::").last.downcase.gsub("_", "-"))
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.resource_name
|
15
|
+
Dry::Inflector.new.pluralize(self.to_s.split("::").last.downcase.gsub("_", "-"))
|
16
|
+
end
|
17
|
+
|
18
|
+
def all
|
19
|
+
module_name = Kongfigure::Resources.const_get(self.class.to_s.split("::").last)
|
20
|
+
@http_client.get("#{resource_name}")["data"].map do |hash_resource|
|
21
|
+
case resource_name
|
22
|
+
when "consumers"
|
23
|
+
hash_resource["acls"] = @http_client.get("#{resource_name}/#{hash_resource['id']}/acls")["data"]
|
24
|
+
hash_resource["key_auths"] = @http_client.get("#{resource_name}/#{hash_resource['id']}/key-auth")["data"]
|
25
|
+
hash_resource["plugins"] = @http_client.get("#{resource_name}/#{hash_resource['id']}/plugins")["data"]
|
26
|
+
when "upstreams"
|
27
|
+
hash_resource["targets"] = @http_client.get("#{resource_name}/#{hash_resource['id']}/targets")["data"]
|
28
|
+
when "services"
|
29
|
+
hash_resource["plugins"] = @http_client.get("#{resource_name}/#{hash_resource['id']}/plugins")["data"]
|
30
|
+
hash_resource["routes"] = @http_client.get("#{resource_name}/#{hash_resource['id']}/routes")["data"]
|
31
|
+
end
|
32
|
+
module_name.build(hash_resource)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_or_update(http_client, resource, remote_resources)
|
37
|
+
handle_api_errors do
|
38
|
+
related_resource = find_related_resource(resource, remote_resources)
|
39
|
+
if related_resource && need_update?(resource, related_resource)
|
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)
|
43
|
+
puts "-> Update dependencies #{resource.class.name} (#{resource.identifier}).".colorize(:light_blue)
|
44
|
+
update_dependencies(http_client, resource, related_resource)
|
45
|
+
elsif related_resource
|
46
|
+
#noop
|
47
|
+
else
|
48
|
+
puts "-> Create #{resource.class.name} (#{resource.identifier}).".colorize(:green)
|
49
|
+
create(http_client, resource, related_resource)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def create(http_client, resource, related_resource)
|
55
|
+
module_name = Kongfigure::Resources.const_get(self.class.to_s.split("::").last)
|
56
|
+
data = http_client.post("#{resource_name}", resource.api_attributes.to_json)
|
57
|
+
create_dependencies(http_client, resource, module_name.build(data))
|
58
|
+
end
|
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)
|
63
|
+
end
|
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}")
|
68
|
+
end
|
69
|
+
|
70
|
+
def cleanup_useless_resources(http_client, local_resources, remote_resources)
|
71
|
+
useless_remote_resources = remote_resources.each do |remote_resource|
|
72
|
+
related_local_resource = find_related_resource(remote_resource, local_resources)
|
73
|
+
handle_api_errors do
|
74
|
+
if need_cleanup_dependencies?(related_local_resource, remote_resource)
|
75
|
+
|
76
|
+
cleanup_dependencies(http_client, related_local_resource, remote_resource)
|
77
|
+
end
|
78
|
+
unless related_local_resource
|
79
|
+
cleanup(http_client, related_local_resource, remote_resource)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def find_related_resource(target_resource, resources)
|
86
|
+
resources.find do|resource|
|
87
|
+
case target_resource.class
|
88
|
+
when Kongfigure::Resources::Plugin
|
89
|
+
resource.name == target_resource.name &&
|
90
|
+
resource.service == target_resource.service &&
|
91
|
+
resource.consumer == target_resource.consumer &&
|
92
|
+
resource.route == target_resource.route
|
93
|
+
else
|
94
|
+
resource.identifier == target_resource.identifier
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def need_update?(resource, related_resource)
|
100
|
+
resource != related_resource
|
101
|
+
end
|
102
|
+
|
103
|
+
def need_update_dependencies?(resource, related_resource)
|
104
|
+
need_update_plugins?(resource, related_resource)
|
105
|
+
end
|
106
|
+
|
107
|
+
def need_cleanup_dependencies?(resource, related_resource)
|
108
|
+
resource.nil? || need_cleanup_plugins?(resource, related_resource)
|
109
|
+
end
|
110
|
+
|
111
|
+
def has_plugins?(resource)
|
112
|
+
resource.plugins && resource.plugins.size > 0
|
113
|
+
end
|
114
|
+
|
115
|
+
def update_dependencies(http_client, local_resource, remote_resource)
|
116
|
+
create_plugins(http_client, local_resource, remote_resource)
|
117
|
+
end
|
118
|
+
|
119
|
+
def create_dependencies(http_client, local_resource, remote_resource)
|
120
|
+
create_plugins(http_client, local_resource, remote_resource)
|
121
|
+
end
|
122
|
+
|
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)
|
126
|
+
end
|
127
|
+
|
128
|
+
def handle_api_errors(&block)
|
129
|
+
begin
|
130
|
+
yield
|
131
|
+
rescue Kongfigure::Errors::BadRequest => e
|
132
|
+
puts "<- Bad request: #{e.message}".colorize(:red)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def need_update_plugins?(resource, related_resource)
|
137
|
+
resource.plugins.reject do |plugin|
|
138
|
+
find_related_resource(plugin, related_resource.plugins)
|
139
|
+
end.size != 0
|
140
|
+
end
|
141
|
+
|
142
|
+
def need_cleanup_plugins?(resource, related_resource)
|
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
|
146
|
+
end
|
147
|
+
|
148
|
+
def create_plugins(http_client, local_resource, remote_resource)
|
149
|
+
local_resource.plugins.each do |plugin|
|
150
|
+
unless find_related_resource(plugin, remote_resource.plugins)
|
151
|
+
http_client.post("#{resource_name}/#{local_resource.identifier}/plugins", plugin.api_attributes.to_json)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def cleanup_plugins(http_client, local_resource, remote_resource)
|
157
|
+
remote_resource.plugins.each do |plugin|
|
158
|
+
unless find_related_resource(plugin, local_resource.plugins)
|
159
|
+
http_client.delete("#{resource_name}/#{remote_resource.identifier}/plugins/#{plugin.id}")
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Kongfigure::Services
|
2
|
+
class Consumer < Base
|
3
|
+
def create_dependencies(http_client, resource, related_resource)
|
4
|
+
super(http_client, resource, related_resource)
|
5
|
+
create_key_auths(http_client, resource, related_resource)
|
6
|
+
create_acls(http_client, resource, related_resource)
|
7
|
+
end
|
8
|
+
|
9
|
+
def update_dependencies(http_client, resource, related_resource)
|
10
|
+
super(http_client, resource, related_resource)
|
11
|
+
create_key_auths(http_client, resource, related_resource)
|
12
|
+
create_acls(http_client, resource, related_resource)
|
13
|
+
end
|
14
|
+
|
15
|
+
def cleanup_dependencies(http_client, resource, related_resource)
|
16
|
+
super(http_client, resource, related_resource)
|
17
|
+
cleanup_key_auths(http_client, resource, related_resource)
|
18
|
+
cleanup_acls(http_client, resource, related_resource)
|
19
|
+
end
|
20
|
+
|
21
|
+
def need_update_dependencies?(resource, related_resource)
|
22
|
+
super(resource, related_resource) ||
|
23
|
+
(resource && (resource.acls != related_resource.acls || resource.key_auths != related_resource.key_auths))
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def create_acls(http_client, resource, related_resource)
|
29
|
+
resource.acls.each do |acl|
|
30
|
+
unless related_resource.has_acl?(acl)
|
31
|
+
http_client.post("#{resource_name}/#{related_resource.identifier}/acls", acl.api_attributes.to_json)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_key_auths(http_client, resource, related_resource)
|
37
|
+
resource.key_auths.each do |key_auth|
|
38
|
+
unless related_resource.has_key_auth?(key_auth)
|
39
|
+
http_client.post("#{resource_name}/#{related_resource.identifier}/key-auth", key_auth.api_attributes.to_json)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def cleanup_key_auths(http_client, local_resource, remote_resource)
|
45
|
+
remote_resource.key_auths.each do |remote_resource_key_auth|
|
46
|
+
unless local_resource.has_key_auth?(remote_resource_key_auth)
|
47
|
+
http_client.delete("#{resource_name}/#{remote_resource.identifier}/key-auth/#{remote_resource_key_auth.id}")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def cleanup_acls(http_client, local_resource, remote_resource)
|
53
|
+
remote_resource.acls.each do |remote_resource_acl|
|
54
|
+
unless local_resource.has_acl?(remote_resource_acl)
|
55
|
+
http_client.delete("#{resource_name}/#{remote_resource.identifier}/acls/#{remote_resource_acl.id}")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Kongfigure::Services
|
2
|
+
class Plugin < Base
|
3
|
+
|
4
|
+
def need_update_dependencies?(resource, related_resource)
|
5
|
+
false
|
6
|
+
end
|
7
|
+
|
8
|
+
def need_cleanup_dependencies?(resource, related_resource)
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
def cleanup(http_client, resource, related_resource)
|
13
|
+
return unless related_resource.is_global?
|
14
|
+
puts "-> Cleanup #{remote_resource.class.name} (#{remote_resource.identifier}).".colorize(:magenta)
|
15
|
+
http_client.delete("#{resource_name}/#{related_resource.id}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Kongfigure::Services
|
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)
|
6
|
+
end
|
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)
|
11
|
+
end
|
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)
|
16
|
+
end
|
17
|
+
|
18
|
+
def need_cleanup_dependencies?(resource, related_resource)
|
19
|
+
super(resource, related_resource) || resource.nil? || resource.routes != related_resource.routes
|
20
|
+
end
|
21
|
+
|
22
|
+
def need_update_dependencies?(resource, related_resource)
|
23
|
+
super(resource, related_resource) || (resource && (resource.routes != related_resource.routes))
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def create_routes(http_client, resource, related_resource)
|
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)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def cleanup_routes(http_client, local_resource, remote_resource)
|
37
|
+
# cleanup duplicated routes
|
38
|
+
duplicated_routes = remote_resource.routes.select do |route|
|
39
|
+
remote_resource.routes.count(route) > 1
|
40
|
+
end.uniq
|
41
|
+
duplicated_routes.each do |duplicated_route|
|
42
|
+
http_client.delete("routes/#{duplicated_route.id}")
|
43
|
+
remote_resource.routes.delete(duplicated_route)
|
44
|
+
end
|
45
|
+
# cleanup useless routes
|
46
|
+
remote_resource.routes.each do |remote_resource_route|
|
47
|
+
unless local_resource.has_route?(remote_resource_route)
|
48
|
+
http_client.delete("routes/#{remote_resource_route.id}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Kongfigure::Services
|
2
|
+
class Upstream < Base
|
3
|
+
def create_dependencies(http_client, resource, related_resource)
|
4
|
+
super(http_client, resource, related_resource)
|
5
|
+
create_targets(http_client, resource, related_resource)
|
6
|
+
end
|
7
|
+
|
8
|
+
def update_dependencies(http_client, resource, related_resource)
|
9
|
+
super(http_client, resource, related_resource)
|
10
|
+
create_targets(http_client, resource, related_resource)
|
11
|
+
end
|
12
|
+
|
13
|
+
def cleanup_dependencies(http_client, resource, related_resource)
|
14
|
+
super(http_client, resource, related_resource)
|
15
|
+
cleanup_targets(http_client, resource, related_resource)
|
16
|
+
end
|
17
|
+
|
18
|
+
def need_update_dependencies?(resource, related_resource)
|
19
|
+
super(resource, related_resource) &&
|
20
|
+
resource && (resource.targets != related_resource.targets)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def create_targets(http_client, resource, related_resource)
|
26
|
+
resource.targets.each do |target|
|
27
|
+
unless related_resource.has_target?(target)
|
28
|
+
http_client.post("#{resource_name}/#{related_resource.identifier}/targets", target.api_attributes.to_json)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def cleanup_targets(http_client, local_resource, remote_resource)
|
34
|
+
remote_resource.targets.each do |remote_resource_target|
|
35
|
+
if (local_resource.nil? || !local_resource.has_target?(remote_resource_target)) && remote_resource_target.weight > 0
|
36
|
+
http_client.delete("#{resource_name}/#{remote_resource.identifier}/targets/#{remote_resource_target.id}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/kongfigure.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative "kongfigure/version.rb"
|
2
|
+
require_relative "kongfigure/cli.rb"
|
3
|
+
require_relative "kongfigure/resources/base.rb"
|
4
|
+
require_relative "kongfigure/resources/consumers/acl.rb"
|
5
|
+
require_relative "kongfigure/resources/consumers/key_auth.rb"
|
6
|
+
require_relative "kongfigure/resources/consumer.rb"
|
7
|
+
require_relative "kongfigure/resources/plugin.rb"
|
8
|
+
require_relative "kongfigure/resources/route.rb"
|
9
|
+
require_relative "kongfigure/resources/service.rb"
|
10
|
+
require_relative "kongfigure/resources/target.rb"
|
11
|
+
require_relative "kongfigure/resources/upstream.rb"
|
12
|
+
require_relative "kongfigure/services/base.rb"
|
13
|
+
require_relative "kongfigure/services/consumer.rb"
|
14
|
+
require_relative "kongfigure/services/plugin.rb"
|
15
|
+
require_relative "kongfigure/services/route.rb"
|
16
|
+
require_relative "kongfigure/services/service.rb"
|
17
|
+
require_relative "kongfigure/services/upstream.rb"
|
18
|
+
require_relative "kongfigure/configuration.rb"
|
19
|
+
require_relative "kongfigure/parser.rb"
|
20
|
+
require_relative "kongfigure/http_client.rb"
|
21
|
+
require_relative "kongfigure/kong.rb"
|
22
|
+
require_relative "kongfigure/errors/resource_not_found.rb"
|
23
|
+
require_relative "kongfigure/errors/resource_conflict.rb"
|
24
|
+
require_relative "kongfigure/errors/bad_request.rb"
|
25
|
+
require_relative "kongfigure/errors/internal_server_error.rb"
|
26
|
+
require_relative "kongfigure/errors/invalid_configuration.rb"
|
27
|
+
|
28
|
+
require "rest-client"
|
29
|
+
require "logger"
|
30
|
+
|
31
|
+
module Kongfigure
|
32
|
+
def self.logger
|
33
|
+
@logger ||= Logger.new(STDOUT)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.start(args)
|
37
|
+
# CLI
|
38
|
+
cli = Kongfigure::CLI.new
|
39
|
+
options = cli.parse!(args)
|
40
|
+
# Parser
|
41
|
+
parser = Kongfigure::Parser.new(options[:file])
|
42
|
+
http_client = Kongfigure::HTTPClient.new
|
43
|
+
kong = Kongfigure::Kong.new(parser, http_client)
|
44
|
+
kong.apply!
|
45
|
+
end
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kongfigure
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ibanity
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-01-25 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.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rest-client
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 2.0.2
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '2.0'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.0.2
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: awesome_print
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.8.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.8.0
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: dry-inflector
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.1.2
|
68
|
+
type: :runtime
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.1.2
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: colorize
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.8.1
|
82
|
+
type: :runtime
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.8.1
|
89
|
+
description: A tool to manage Kong resources with a declarative configuration.
|
90
|
+
email:
|
91
|
+
- it@ibanity.com
|
92
|
+
executables:
|
93
|
+
- kongfigure
|
94
|
+
extensions: []
|
95
|
+
extra_rdoc_files: []
|
96
|
+
files:
|
97
|
+
- ".gitignore"
|
98
|
+
- Gemfile
|
99
|
+
- Gemfile.lock
|
100
|
+
- LICENSE.txt
|
101
|
+
- README.md
|
102
|
+
- exe/kongfigure
|
103
|
+
- exe/kongfigure_local
|
104
|
+
- kongfigure.gemspec
|
105
|
+
- lib/kongfigure.rb
|
106
|
+
- lib/kongfigure/cli.rb
|
107
|
+
- lib/kongfigure/configuration.rb
|
108
|
+
- lib/kongfigure/errors/bad_request.rb
|
109
|
+
- lib/kongfigure/errors/internal_server_error.rb
|
110
|
+
- lib/kongfigure/errors/invalid_configuration.rb
|
111
|
+
- lib/kongfigure/errors/resource_conflict.rb
|
112
|
+
- lib/kongfigure/errors/resource_not_found.rb
|
113
|
+
- lib/kongfigure/http_client.rb
|
114
|
+
- lib/kongfigure/kong.rb
|
115
|
+
- lib/kongfigure/parser.rb
|
116
|
+
- lib/kongfigure/resources/base.rb
|
117
|
+
- lib/kongfigure/resources/consumer.rb
|
118
|
+
- lib/kongfigure/resources/consumers/acl.rb
|
119
|
+
- lib/kongfigure/resources/consumers/key_auth.rb
|
120
|
+
- lib/kongfigure/resources/plugin.rb
|
121
|
+
- lib/kongfigure/resources/route.rb
|
122
|
+
- lib/kongfigure/resources/service.rb
|
123
|
+
- lib/kongfigure/resources/target.rb
|
124
|
+
- lib/kongfigure/resources/upstream.rb
|
125
|
+
- lib/kongfigure/services/base.rb
|
126
|
+
- lib/kongfigure/services/consumer.rb
|
127
|
+
- lib/kongfigure/services/plugin.rb
|
128
|
+
- lib/kongfigure/services/route.rb
|
129
|
+
- lib/kongfigure/services/service.rb
|
130
|
+
- lib/kongfigure/services/upstream.rb
|
131
|
+
- lib/kongfigure/version.rb
|
132
|
+
homepage: https://github.com/ibanity/kongfigure
|
133
|
+
licenses:
|
134
|
+
- MIT
|
135
|
+
metadata: {}
|
136
|
+
post_install_message:
|
137
|
+
rdoc_options: []
|
138
|
+
require_paths:
|
139
|
+
- lib
|
140
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: 2.4.0
|
145
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
requirements: []
|
151
|
+
rubygems_version: 3.0.1
|
152
|
+
signing_key:
|
153
|
+
specification_version: 4
|
154
|
+
summary: Kongfigure.
|
155
|
+
test_files: []
|