Skip to content

Commit aa89d23

Browse files
committedFeb 28, 2020
Alex: Allow an app service in kubernetes to depend on an existing rabbitmq service
1 parent 1bf8b8c commit aa89d23

File tree

5 files changed

+81
-2
lines changed

5 files changed

+81
-2
lines changed
 

‎lib/stackbuilder/stacks/services/app_service.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,8 @@ def generate_app_config(erb_vars, hiera_provider)
257257
<%= k %>=<%= v[0,15] + @credentials_selector.to_s %>
258258
<%- elsif k.start_with?('db.') && k.end_with?('password_hiera_key') -%>
259259
<%= k.gsub(/_hiera_key$/, '') %>=<%= secret("#{v}s", @credentials_selector) %>
260-
<%# TODO: support non-db _hiera_key. For example for a rabbitmq connection -%>
260+
<%- elsif k.end_with?('_hiera_key') -%>
261+
<%= k.gsub(/_hiera_key$/, '') -%>=<%= secret("#{v}") %>
261262
<%- else -%>
262263
<%= k %>=<%= v %>
263264
<%- end -%>

‎lib/stackbuilder/stacks/services/rabbitmq_cluster.rb

+8
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ def to_loadbalancer_config(location, fabric)
3939
}
4040
end
4141

42+
def endpoints(_dependent_service, _fabric)
43+
endpoints = []
44+
@ports.each do |port|
45+
endpoints << { :port => port, :fqdns => children.map(&:prod_fqdn) }
46+
end
47+
endpoints
48+
end
49+
4250
def validate_dependency(dependant, dependency)
4351
fail "Stack '#{dependant.name}' must specify requirement when using depend_on #{name} "\
4452
"in environment '#{environment.name}'. Usage: depend_on <environment>, <requirement>" \

‎lib/stackbuilder/stacks/services/rabbitmq_server.rb

+15
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,21 @@ def to_enc
2424
'rabbit_users' => [])
2525
end
2626

27+
add_dependant_kubernetes_things enc
28+
2729
enc
2830
end
31+
32+
private
33+
34+
def add_dependant_kubernetes_things(enc)
35+
dependant_app_services = @virtual_service.virtual_services_that_depend_on_me.select do |machine_set|
36+
machine_set.is_a? Stacks::Services::AppService
37+
end
38+
39+
return unless dependant_app_services.any?(&:kubernetes)
40+
enc['role::rabbitmq_server']['allow_kubernetes_clusters'] = dependant_app_services.select(&:kubernetes).map do |vs|
41+
vs.environment.options[location]
42+
end.uniq
43+
end
2944
end

‎spec/app_service_spec.rb

+33-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
'e1-x-vip.earth.net.local' => '3.1.4.13',
2424
'e1-nonk8sapp-001.space.net.local' => '3.1.4.14',
2525
'e1-sharedproxy-001.space.net.local' => '3.1.4.15',
26-
'e1-sharedproxy-002.space.net.local' => '3.1.4.16'
26+
'e1-sharedproxy-002.space.net.local' => '3.1.4.16',
27+
'e1-myrabbit-001.space.net.local' => '3.1.4.17',
28+
'e1-myrabbit-002.space.net.local' => '3.1.4.18'
2729
)
2830
end
2931
let(:hiera_provider) do
@@ -1420,6 +1422,36 @@ def k8s_resource(set, kind)
14201422
/mx)
14211423
end
14221424

1425+
it 'has config for it\'s rabbitmq dependencies' do
1426+
factory = eval_stacks do
1427+
stack "mystack" do
1428+
app_service "x", :kubernetes => true do
1429+
self.maintainers = [person('Testers')]
1430+
self.description = 'Testing'
1431+
1432+
self.application = 'MyApplication'
1433+
self.short_name = 'myappl'
1434+
self.startup_alert_threshold = '1h'
1435+
depend_on 'myrabbit', 'e1', 'test'
1436+
end
1437+
end
1438+
stack "my_rabbit" do
1439+
rabbitmq_cluster "myrabbit"
1440+
end
1441+
env "e1", :primary_site => 'space', :short_name => 'spc' do
1442+
instantiate_stack "mystack"
1443+
instantiate_stack "my_rabbit"
1444+
end
1445+
end
1446+
set = factory.inventory.find_environment('e1').definitions['mystack'].k8s_machinesets['x']
1447+
expect(k8s_resource(set, 'ConfigMap')['data']['config.properties']).
1448+
to match(/test.messaging.enabled=true.*
1449+
test.messaging.broker_fqdns=e1-myrabbit-001.space.net.local,e1-myrabbit-002.space.net.local.*
1450+
test.messaging.username=MyApplication.*
1451+
test.messaging.password=\{SECRET:e1_MyApplication_messaging_password\}.*
1452+
/mx)
1453+
end
1454+
14231455
it 'fails when the app version cannot be found' do
14241456
factory = eval_stacks do
14251457
stack "mystack" do

‎spec/rabbitmq_spec.rb

+23
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,29 @@
8282
end
8383
end
8484

85+
describe_stack 'when a k8s app is a dependant the cluster appears in the enc' do
86+
given do
87+
stack 'test' do
88+
rabbitmq_cluster 'rabbitmq'
89+
app_service 'exampleapp', :kubernetes => true do
90+
self.application = 'example'
91+
self.maintainers = [person('Testers')]
92+
self.description = 'Testing'
93+
depend_on 'rabbitmq', 'e1', :magic
94+
end
95+
end
96+
97+
env 'e1', :primary_site => 'space' do
98+
instantiate_stack 'test'
99+
end
100+
end
101+
102+
host('e1-rabbitmq-001.mgmt.space.net.local') do |host|
103+
expect(host.to_enc['role::rabbitmq_server']['allow_kubernetes_clusters']).to include(
104+
'space')
105+
end
106+
end
107+
85108
describe_stack 'rabbitmq users are created from dependencies' do
86109
given do
87110
stack 'test' do

0 commit comments

Comments
 (0)