vagrant-cloudstack 1.4.0 → 1.5.0

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.
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-----