vagrant-cloudstack 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.travis.yml +13 -9
  4. data/CHANGELOG.md +30 -0
  5. data/Docker/Dockerfile +5 -8
  6. data/Docker/Dockerfile.chefdk_0_17 +2 -2
  7. data/Docker/Dockerfile.latest_dependencies +2 -2
  8. data/Docker/README.md +63 -35
  9. data/Gemfile +2 -2
  10. data/Gemfile.lock +307 -0
  11. data/README.md +3 -3
  12. data/Rakefile +2 -2
  13. data/build_rpm.sh +1 -1
  14. data/functional-tests/rsync/Vagrantfile.advanced_networking +1 -0
  15. data/functional-tests/vmlifecycle/Vagrantfile.advanced_networking +5 -7
  16. data/functional-tests/vmlifecycle/vmlifecycle_spec.rb +14 -2
  17. data/lib/vagrant-cloudstack/action/read_rdp_info.rb +9 -43
  18. data/lib/vagrant-cloudstack/action/read_ssh_info.rb +10 -44
  19. data/lib/vagrant-cloudstack/action/read_transport_info.rb +59 -0
  20. data/lib/vagrant-cloudstack/action/read_winrm_info.rb +10 -44
  21. data/lib/vagrant-cloudstack/action/run_instance.rb +607 -498
  22. data/lib/vagrant-cloudstack/action/terminate_instance.rb +17 -41
  23. data/lib/vagrant-cloudstack/config.rb +41 -166
  24. data/lib/vagrant-cloudstack/exceptions/exceptions.rb +7 -2
  25. data/lib/vagrant-cloudstack/service/cloudstack_resource_service.rb +17 -5
  26. data/lib/vagrant-cloudstack/version.rb +1 -1
  27. data/spec/spec_helper.rb +45 -0
  28. data/spec/vagrant-cloudstack/action/retrieve_public_ip_port_spec.rb +94 -0
  29. data/spec/vagrant-cloudstack/action/run_instance_spec.rb +609 -0
  30. data/spec/vagrant-cloudstack/action/terminate_instance_spec.rb +248 -0
  31. data/spec/vagrant-cloudstack/config_spec.rb +7 -7
  32. data/vagrant-cloudstack.gemspec +2 -1
  33. metadata +22 -10
  34. data/bootstrap.key +0 -27
@@ -0,0 +1,248 @@
1
+ require 'spec_helper'
2
+ require 'vagrant-cloudstack/action/terminate_instance'
3
+ require 'vagrant-cloudstack/config'
4
+
5
+ require 'vagrant'
6
+ require 'fog'
7
+
8
+ describe VagrantPlugins::Cloudstack::Action::TerminateInstance do
9
+ let(:action) { VagrantPlugins::Cloudstack::Action::TerminateInstance.new(app, env) }
10
+
11
+ let(:destroy_server_response) { { id: JOB_ID } }
12
+
13
+ let(:cs_job) { double('Fog::Compute::Cloudstack::Job') }
14
+
15
+ let(:fake_job_result) do
16
+ {
17
+ 'queryasyncjobresultresponse' => {
18
+ 'jobstatus' => 1,
19
+ 'jobresult' => {
20
+ 'portforwardingrule' => {
21
+ 'id' => PORT_FORWARDING_RULE_ID
22
+ },
23
+ 'networkacl' => {
24
+ 'id' => ACL_ID
25
+ },
26
+ 'virtualmachine' => {
27
+ 'password' => GENERATED_PASSWORD
28
+ }
29
+ }
30
+ }
31
+ }
32
+ end
33
+
34
+ describe '#terminate_instance in advanced zone' do
35
+ subject { action.call(env) }
36
+ let(:app) { double('Vagrant::Action::Warden') }
37
+
38
+ let(:provider_config) do
39
+ config = VagrantPlugins::Cloudstack::Config.new
40
+
41
+ config.finalize!
42
+ config.get_domain_config(:cloudstack)
43
+ end
44
+
45
+ let(:machine) { double('Vagrant::Machine') }
46
+ let(:data_dir) { double('Pathname') }
47
+ let(:a_path) { double('Pathname') }
48
+ let(:file) { double('File') }
49
+
50
+ let(:cloudstack_compute) { double('Fog::Compute::Cloudstack') }
51
+ let(:servers) { double('Fog::Compute::Cloudstack::Servers') }
52
+ let(:server) { double('Fog::Compute::Cloudstack::Server') }
53
+ let(:ui) { double('Vagrant::UI::Prefixed') }
54
+ let(:root_path) { double('Pathname') }
55
+ let(:env) do
56
+ {
57
+ root_path: root_path,
58
+ ui: ui,
59
+ machine: machine,
60
+ cloudstack_compute: cloudstack_compute
61
+ }
62
+ end
63
+
64
+ before(:each) do
65
+ allow(app).to receive(:call).and_return(true)
66
+
67
+ allow(ui).to receive(:info)
68
+ expect(ui).not_to receive(:warn)
69
+ allow(ui).to receive(:detail)
70
+
71
+ allow(machine).to receive(:provider_config).and_return(provider_config)
72
+ allow(machine).to receive(:data_dir).and_return(data_dir)
73
+
74
+ allow(data_dir).to receive(:join).and_return(a_path)
75
+ allow(a_path).to receive(:file?).and_return(false)
76
+
77
+ expect(cloudstack_compute).to receive(:servers).and_return(servers)
78
+ expect(servers).to receive(:get).with(SERVER_ID).and_return(server)
79
+ expect(server).to receive(:destroy).with('expunge' => false).and_return(cs_job)
80
+ expect(cs_job).to receive(:id).and_return(JOB_ID)
81
+
82
+ allow(cloudstack_compute).to receive(:query_async_job_result).with(jobid: JOB_ID).and_return(fake_job_result)
83
+ allow(machine).to receive(:id).and_return(SERVER_ID)
84
+ expect(machine).to receive(:id=).with(nil)
85
+ end
86
+
87
+ context 'destroys a simple VM' do
88
+ it 'destroys a vm' do
89
+ should eq true
90
+ end
91
+
92
+ context 'with firewall rules removal' do
93
+ let(:firewall_path) { double('Pathname') }
94
+ let(:file_content) { double }
95
+ let(:firewall_rule) { 'UUID of Firewall rule' }
96
+ let(:network_acl) { 'UUID of ACL' }
97
+
98
+ before(:each) do
99
+ expect(data_dir).to receive(:join).with('firewall').and_return(firewall_path)
100
+ expect(firewall_path).to receive(:file?).and_return(true)
101
+ # A VM will never belong to both a VPC and regular router, but allowed for this test
102
+ allow(File).to receive(:read).and_return("#{network_acl},networkacl\n" + "#{firewall_rule},firewallrule\n")
103
+
104
+ expect(cloudstack_compute).to receive(:request)
105
+ .with(command: 'deleteNetworkACL', id: network_acl)
106
+ .and_return('deletenetworkaclresponse' => { 'jobid' => JOB_ID })
107
+
108
+ expect(cloudstack_compute).to receive(:request)
109
+ .with(command: 'deleteFirewallRule', id: 'UUID of Firewall rule')
110
+ .and_return('deletefirewallruleresponse' => { 'jobid' => JOB_ID })
111
+
112
+ expect(firewall_path).to receive(:delete).and_return(true)
113
+ end
114
+
115
+ it 'destroys a vm' do
116
+ should eq true
117
+ end
118
+ end
119
+
120
+ context 'with port forwarding removal' do
121
+ let(:port_forwarding_path) { double('Pathname') }
122
+
123
+ before(:each) do
124
+ expect(data_dir).to receive(:join).with('port_forwarding').and_return(port_forwarding_path)
125
+ expect(port_forwarding_path).to receive(:file?).and_return(true)
126
+ allow(File).to receive(:read)
127
+ .and_return("#{PORT_FORWARDING_RULE_ID}\n#{PORT_FORWARDING_RULE_ID}_2\n#{PORT_FORWARDING_RULE_ID}_3")
128
+
129
+ [PORT_FORWARDING_RULE_ID, "#{PORT_FORWARDING_RULE_ID}_2", "#{PORT_FORWARDING_RULE_ID}_3"]
130
+ .each do |port_forwarding_rule_id|
131
+
132
+ expect(cloudstack_compute).to receive(:delete_port_forwarding_rule)
133
+ .with(id: port_forwarding_rule_id)
134
+ .and_return('deleteportforwardingruleresponse' => { 'jobid' => JOB_ID })
135
+ end
136
+ expect(port_forwarding_path).to receive(:delete).and_return(true)
137
+ end
138
+
139
+ it 'destroys a vm' do
140
+ should eq true
141
+ end
142
+ end
143
+
144
+ context 'with volume removal' do
145
+ let(:volumes_path) { double('Pathname') }
146
+
147
+ before(:each) do
148
+ expect(data_dir).to receive(:join).with('volumes').and_return(volumes_path)
149
+ expect(volumes_path).to receive(:file?).and_return(true)
150
+ allow(File).to receive(:read)
151
+ .and_return("#{VOLUME_ID}\n#{VOLUME_ID}_2\n#{VOLUME_ID}_3")
152
+
153
+ [VOLUME_ID, "#{VOLUME_ID}_2", "#{VOLUME_ID}_3"]
154
+ .each do |volume_id|
155
+
156
+ expect(cloudstack_compute).to receive(:detach_volume)
157
+ .with(id: volume_id)
158
+ .and_return('detachvolumeresponse' => { 'jobid' => JOB_ID })
159
+ expect(cloudstack_compute).to receive(:delete_volume)
160
+ .with(id: volume_id)
161
+ .and_return('deletevolumeresponse' => { 'success' => 'true' })
162
+ end
163
+ expect(volumes_path).to receive(:delete).and_return(true)
164
+ end
165
+
166
+ it 'destroys a vm' do
167
+ should eq true
168
+ end
169
+ end
170
+
171
+ context 'with credentials file removal' do
172
+ let(:credentials_path) { double('Pathname') }
173
+
174
+ before(:each) do
175
+ expect(data_dir).to receive(:join).with('vmcredentials').and_return(credentials_path)
176
+ expect(credentials_path).to receive(:file?).and_return(true)
177
+ expect(credentials_path).to receive(:delete).and_return(true)
178
+ end
179
+
180
+ it 'destroys a vm' do
181
+ should eq true
182
+ end
183
+ end
184
+
185
+ context 'with generated SSH key removal' do
186
+ let(:ssh_key_path) { double('Pathname') }
187
+
188
+ before(:each) do
189
+ expect(data_dir).to receive(:join).with('sshkeyname').and_return(ssh_key_path)
190
+ expect(ssh_key_path).to receive(:file?).and_return(true)
191
+ allow(File).to receive(:read)
192
+ .and_return("#{SSH_GENERATED_KEY_NAME}\n")
193
+
194
+ expect(cloudstack_compute).to receive(:delete_ssh_key_pair)
195
+ .with(name: SSH_GENERATED_KEY_NAME)
196
+ .and_return('deletesshkeypairresponse' => { 'success' => 'true' })
197
+
198
+ expect(ssh_key_path).to receive(:delete).and_return(true)
199
+ end
200
+
201
+ it 'destroys a vm' do
202
+ should eq true
203
+ end
204
+ end
205
+
206
+ context 'with security groups removal' do
207
+ let(:security_group_path) { double('Pathname') }
208
+ let(:cloudstack_securitygroups) { double('Fog::Compute::Cloudstack::SecurityGroups') }
209
+ let(:cloudstack_securitygroup) { double('Fog::Compute::Cloudstack::SecurityGroup') }
210
+ RULE_ID_INGRESS = 'UUID of Ingress Rule'.freeze
211
+ RULE_ID_EGRESS = 'UUID of Egress Rule'.freeze
212
+
213
+ before(:each) do
214
+ expect(data_dir).to receive(:join).with('security_groups').and_return(security_group_path)
215
+ expect(security_group_path).to receive(:file?).and_return(true)
216
+ allow(File).to receive(:read)
217
+ .and_return("#{SECURITY_GROUP_ID}\n")
218
+
219
+ expect(cloudstack_compute).to receive(:security_groups).and_return(cloudstack_securitygroups)
220
+ expect(cloudstack_securitygroups).to receive(:get)
221
+ .with(SECURITY_GROUP_ID)
222
+ .and_return(cloudstack_securitygroup)
223
+
224
+ expect(cloudstack_securitygroup).to receive(:ingress_rules)
225
+ .and_return([{ 'ruleid' => RULE_ID_INGRESS }])
226
+ expect(cloudstack_compute).to receive(:revoke_security_group_ingress)
227
+ .with(id: RULE_ID_INGRESS)
228
+ .and_return('revokesecuritygroupingressresponse' => { 'jobid' => JOB_ID })
229
+
230
+ expect(cloudstack_securitygroup).to receive(:egress_rules)
231
+ .and_return([{ 'ruleid' => RULE_ID_EGRESS }])
232
+ expect(cloudstack_compute).to receive(:revoke_security_group_egress)
233
+ .with(id: RULE_ID_EGRESS)
234
+ .and_return('revokesecuritygroupegressresponse' => { 'jobid' => JOB_ID })
235
+
236
+ expect(cloudstack_compute).to receive(:delete_security_group)
237
+ .with(id: SECURITY_GROUP_ID)
238
+
239
+ expect(security_group_path).to receive(:delete).and_return(true)
240
+ end
241
+
242
+ it 'destroys a vm' do
243
+ should eq true
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end
@@ -6,7 +6,7 @@ describe VagrantPlugins::Cloudstack::Config do
6
6
 
7
7
  # Ensure tests are not affected by Cloudstack credential environment variables
8
8
  before :each do
9
- ENV.stub(:[] => nil)
9
+ allow(ENV).to receive_messages(:[] => nil)
10
10
  end
11
11
 
12
12
  describe "defaults" do
@@ -37,7 +37,7 @@ describe VagrantPlugins::Cloudstack::Config do
37
37
  its("pf_public_port") { should be_nil }
38
38
  its("pf_public_rdp_port") { should be_nil }
39
39
  its("pf_private_rdp_port") { should == 3389 }
40
- its("pf_public_port_randomrange") { should == {:start=>49160, :end=>49200} }
40
+ its("pf_public_port_randomrange") { should == {:start=>49152, :end=>65535} }
41
41
  its("pf_private_port") { should be_nil }
42
42
  its("pf_open_firewall") { should == true }
43
43
  its("pf_trusted_networks") { should be_nil }
@@ -71,8 +71,8 @@ describe VagrantPlugins::Cloudstack::Config do
71
71
 
72
72
  context "with CloudStack credential variables" do
73
73
  before :each do
74
- ENV.stub(:[]).with("CLOUDSTACK_API_KEY").and_return("api_key")
75
- ENV.stub(:[]).with("CLOUDSTACK_SECRET_KEY").and_return("secret_key")
74
+ allow(ENV).to receive(:[]).with("CLOUDSTACK_API_KEY").and_return("api_key")
75
+ allow(ENV).to receive(:[]).with("CLOUDSTACK_SECRET_KEY").and_return("secret_key")
76
76
  end
77
77
 
78
78
  subject do
@@ -98,7 +98,7 @@ describe VagrantPlugins::Cloudstack::Config do
98
98
  it "should not default #{attribute} if overridden" do
99
99
  instance.send("#{attribute}=".to_sym, "foo")
100
100
  instance.finalize!
101
- instance.send(attribute).should == "foo"
101
+ expect(instance.send(attribute)).to be =='foo'
102
102
  end
103
103
 
104
104
  end
@@ -107,7 +107,7 @@ describe VagrantPlugins::Cloudstack::Config do
107
107
  instance.pf_open_firewall = false
108
108
  instance.finalize!
109
109
 
110
- instance.pf_open_firewall.should == false
110
+ expect(instance.pf_open_firewall).to be false
111
111
  end
112
112
  end
113
113
 
@@ -208,7 +208,7 @@ describe VagrantPlugins::Cloudstack::Config do
208
208
 
209
209
  it "should raise an exception if not finalized" do
210
210
  expect { instance.get_domain_config("default") }.
211
- to raise_error
211
+ to raise_error(RuntimeError)
212
212
  end
213
213
 
214
214
  context "with no specific config set" do
@@ -15,7 +15,8 @@ Gem::Specification.new do |s|
15
15
  s.required_rubygems_version = '>= 1.3.6'
16
16
  s.rubyforge_project = 'vagrant-cloudstack'
17
17
 
18
- s.add_runtime_dependency 'fog', '~> 1.32', '>= 1.32.0'
18
+ s.add_runtime_dependency 'fog', '>= 1.32.0'
19
+ s.add_runtime_dependency 'fog-xml', '>= 0.1.2'
19
20
 
20
21
  s.add_development_dependency 'rake', '>= 10.4', '~> 10.5'
21
22
  s.add_development_dependency 'rspec-core', '~> 2.14', '>= 2.14.7'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-cloudstack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitchell Hashimoto
@@ -22,15 +22,12 @@ authors:
22
22
  autorequire:
23
23
  bindir: bin
24
24
  cert_chain: []
25
- date: 2016-11-30 00:00:00.000000000 Z
25
+ date: 2018-10-17 00:00:00.000000000 Z
26
26
  dependencies:
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: fog
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.32'
34
31
  - - ">="
35
32
  - !ruby/object:Gem::Version
36
33
  version: 1.32.0
@@ -38,12 +35,23 @@ dependencies:
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
- - - "~>"
42
- - !ruby/object:Gem::Version
43
- version: '1.32'
44
38
  - - ">="
45
39
  - !ruby/object:Gem::Version
46
40
  version: 1.32.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: fog-xml
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.1.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.1.2
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: rake
49
57
  requirement: !ruby/object:Gem::Requirement
@@ -143,10 +151,10 @@ files:
143
151
  - Docker/vac.ps1
144
152
  - Docker/vac.sh
145
153
  - Gemfile
154
+ - Gemfile.lock
146
155
  - LICENSE
147
156
  - README.md
148
157
  - Rakefile
149
- - bootstrap.key
150
158
  - build_rpm.sh
151
159
  - functional-tests/basic/Vagrantfile.basic_networking
152
160
  - functional-tests/basic/basic_spec.rb
@@ -167,6 +175,7 @@ files:
167
175
  - lib/vagrant-cloudstack/action/read_rdp_info.rb
168
176
  - lib/vagrant-cloudstack/action/read_ssh_info.rb
169
177
  - lib/vagrant-cloudstack/action/read_state.rb
178
+ - lib/vagrant-cloudstack/action/read_transport_info.rb
170
179
  - lib/vagrant-cloudstack/action/read_winrm_info.rb
171
180
  - lib/vagrant-cloudstack/action/run_instance.rb
172
181
  - lib/vagrant-cloudstack/action/start_instance.rb
@@ -189,6 +198,9 @@ files:
189
198
  - locales/en.yml
190
199
  - spec/spec_helper.rb
191
200
  - spec/vagrant-cloudstack/action/read_ssh_info_spec.rb
201
+ - spec/vagrant-cloudstack/action/retrieve_public_ip_port_spec.rb
202
+ - spec/vagrant-cloudstack/action/run_instance_spec.rb
203
+ - spec/vagrant-cloudstack/action/terminate_instance_spec.rb
192
204
  - spec/vagrant-cloudstack/config_spec.rb
193
205
  - spec/vagrant-cloudstack/model/cloudstack_resource_spec.rb
194
206
  - spec/vagrant-cloudstack/service/cloudstack_resource_service_spec.rb
@@ -215,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
215
227
  version: 1.3.6
216
228
  requirements: []
217
229
  rubyforge_project: vagrant-cloudstack
218
- rubygems_version: 2.4.8
230
+ rubygems_version: 2.6.12
219
231
  signing_key:
220
232
  specification_version: 4
221
233
  summary: Enables Vagrant to manage machines in Cloudstack.
data/bootstrap.key DELETED
@@ -1,27 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEowIBAAKCAQEAyxoANMip0RrJ9YeBHrw9J6zEcHtY06I930mV5Jj0qQh4xY+x
3
- t2ra2GZFGYBHDqp8akIgm5wXsBUXX1KoP2DsURyKTeo4UrXG+KAaVziTKqbPxGHO
4
- 1HxZ1xkEifW1+UlC9Ghu2klI2MyedgpVwsEvT6JYyu7UJeklE3DrWkQHOFN7J/IL
5
- XtuP7PvSYVC+5TUgyCC1n0KJLixjFgCPZl+5xpY3oM5gU9jVWOXGwUPt3d2/RgnF
6
- 0XLeGlm0TbibVX+Po5OEmC3c8cccBg5JIOVUZ8Yq6EuejjfFYkMET5B2MLTDdrl0
7
- pzv9EIVsGuQ5jQCzrMkiSz9ExTU6OPKJZWTRUwIBIwKCAQEAnK2oYzu2M5hSp3cp
8
- F7XIxtW8HEHlcA9xjv5AboSfexUp9316d4zx92TWOD5is4rVAYN4PYcK9YydAGRV
9
- 57/MPpJcEDhXVb9tmzmt64NqNth0ZEtzqztbP4hT9WXG5OC+n0k/knMMT3lHCppC
10
- KIZmU1/7Wrg9QdEcmfgGA84UMsKstkmyZQvNoxEDnLV3u0e6dLv1lrSnn2wuJl6u
11
- eEcGq119wW/xKV5wgjgE7G8SDQ4DwFLaRUNA3GEeIYdXU1v5AI+5HjR+/VCa89GM
12
- qb8mfUZjf1sxYW2s8kxxusAgMq/H2SRLekg8TwlzF3xHlPTxxOVnmV9/zQ3e9Fik
13
- RTNumwKBgQD94SNYdhX7m2qg+GNHKn00qSMQJOEYCKxmac3fwFdqQxibGXiFDrrL
14
- w/n44QoRwP2v5/byxChYVD6ART0SLuclKXMsOH35ht2W6DJltALFZp8upVk1ZSah
15
- zfotISXcYxaCnIugG7QfQdyeFSA3uN9vH7FEze0v9DTPXTIrPJvqWwKBgQDMzEk9
16
- b0SARUu68x6tHUf6azlnH1FVfMRYjWwZVfgXdfF0xXjlBgJuQXPHflSL0xBDZMPe
17
- CNbl19Yy5oA94HaGguFL9il3sMNm60eCaurFaD2Ew8gMtECYuQIwyo3+SYr7a12Y
18
- oSo6S8J7Myxiqr3SQgFzo4pvJgFmSaxG2I+2aQKBgQCuFrkmt1+H9YryCWil0/4V
19
- e0s+RSyixB5yHKptizSgowmO7OTthnF1yDZhhF6tFp9UDMaX1vcX/0DM/EciaU4K
20
- 2pgeUp+GiF1uyxs+bM6zPw4RW3BfIMoIjT3VzZZN+s2bZAf4wookD+e820lKx+mr
21
- SO6VlIVithWVgbwAZBMkWwKBgEY3aZFn+jqbamv7lX0unFXbnqcDbFfTAX1yUPK+
22
- Y7BFsd7knnpoddyouftBQY8GiTuthPurQl1ukpUb1DJ42C4ePp2ze+6Fv1Z8jYvM
23
- 4sdW8IVKcHliX0pOD2EvgSP79SMAPVjmzKZF3Ed/Qmr4thwz4z2XKCYbqLVbFn6w
24
- pk0rAoGBAJWNcH9WB5itvwRrfn0G+Q1reH/8rc59QkU+XfDnJadBcvDc41bGiUM1
25
- ynlE1/1emU3L2syZrT7Wuob1wNzMfeHLIASuIjYt337bHfWsT8qI4BekhZf/PoNx
26
- eYhpBXmesWJWksYOuMt+/cFus+59Rm6cFrLrp1bgzzqDPNGaslyD
27
- -----END RSA PRIVATE KEY-----