saklient 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/saklient/cloud/client.rb +1 -1
- data/lib/saklient/cloud/resources/bridge.rb +1 -5
- data/lib/saklient/cloud/resources/disk.rb +18 -1
- data/lib/saklient/cloud/resources/gslb.rb +5 -4
- data/lib/saklient/cloud/resources/iface.rb +9 -0
- data/lib/saklient/cloud/resources/server.rb +233 -4
- data/lib/saklient/util.rb +23 -0
- data/lib/saklient/version.rb +1 -1
- data/spec/server_spec.rb +204 -149
- data/spec/util_spec.rb +20 -0
- metadata +2 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea3d7d1ce2e74631267fa33bef7aea4976c5e100
|
4
|
+
data.tar.gz: 884896e9ea1cf5a42fd6e593977253d4c13abca0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e85eb5d462b07c79246dec157a0c350df22175c3239f541ef8fa597393afa0f400d708fddf4d18f7eb1534b030a3e1edb4aae3e9c6efde7f480d39bcd4acaec7
|
7
|
+
data.tar.gz: 0d1877f0c22d22d7c9cecbb570fda2c8c59e0c16da9230d25dd4f4f8b48c71b8d647b090e5d676c480fdc8692dabbaffd0b6bc58dde0a828b7849dc0347a763c
|
@@ -78,7 +78,7 @@ module Saklient
|
|
78
78
|
|
79
79
|
extra_headers = {
|
80
80
|
'Content-Type' => 'application/x-www-form-urlencoded',
|
81
|
-
'User-Agent' => 'saklient.ruby ver-0.0.
|
81
|
+
'User-Agent' => 'saklient.ruby ver-0.0.7 rev-bab628f6f4c2a9d37b38c634b4a514cb66467939',
|
82
82
|
'X-Requested-With' => 'XMLHttpRequest',
|
83
83
|
'X-Sakura-HTTP-Method' => method,
|
84
84
|
'X-Sakura-Error-Level' => 'warning',
|
@@ -291,11 +291,7 @@ module Saklient
|
|
291
291
|
missing << 'name' if @is_new
|
292
292
|
end
|
293
293
|
Saklient::Util::set_by_path(ret, 'Description', @m_description) if withClean || @n_description
|
294
|
-
if withClean || @n_region
|
295
|
-
Saklient::Util::set_by_path(ret, 'Region', withClean ? ((@m_region).nil? ? nil : @m_region.api_serialize(withClean)) : ((@m_region).nil? ? { ID: '0' } : @m_region.api_serialize_id))
|
296
|
-
else
|
297
|
-
missing << 'region' if @is_new
|
298
|
-
end
|
294
|
+
Saklient::Util::set_by_path(ret, 'Region', withClean ? ((@m_region).nil? ? nil : @m_region.api_serialize(withClean)) : ((@m_region).nil? ? { ID: '0' } : @m_region.api_serialize_id)) if withClean || @n_region
|
299
295
|
raise Saklient::Errors::SaklientException.new('required_field', 'Required fields must be set before the Bridge creation: ' + missing.join(', ')) if missing.length > 0
|
300
296
|
return ret
|
301
297
|
end
|
@@ -647,17 +647,34 @@ module Saklient
|
|
647
647
|
return @m_server
|
648
648
|
end
|
649
649
|
|
650
|
+
# (This method is generated in Translator_default#buildImpl)
|
651
|
+
#
|
652
|
+
# @private
|
653
|
+
# @param [Server] v
|
654
|
+
# @return [Server]
|
655
|
+
def set_server(v)
|
656
|
+
Saklient::Util::validate_type(v, 'Saklient::Cloud::Resources::Server')
|
657
|
+
raise Saklient::Errors::SaklientException.new('immutable_field', 'Immutable fields cannot be modified after the resource creation: ' + 'Saklient::Cloud::Resources::Disk#server') if !@is_new
|
658
|
+
@m_server = v
|
659
|
+
@n_server = true
|
660
|
+
return @m_server
|
661
|
+
end
|
662
|
+
|
650
663
|
public
|
651
664
|
|
652
665
|
# 接続先のサーバ
|
653
666
|
#
|
654
667
|
# @return [Server]
|
655
|
-
|
668
|
+
attr_accessor :server
|
656
669
|
|
657
670
|
def server
|
658
671
|
get_server
|
659
672
|
end
|
660
673
|
|
674
|
+
def server=(v)
|
675
|
+
set_server(v)
|
676
|
+
end
|
677
|
+
|
661
678
|
protected
|
662
679
|
|
663
680
|
# @return [bool]
|
@@ -226,10 +226,11 @@ module Saklient
|
|
226
226
|
settings = self.raw_settings
|
227
227
|
if !(settings).nil?
|
228
228
|
raw = Saklient::Util::get_by_path(settings, 'GSLB.Servers')
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
229
|
+
if !(raw).nil?
|
230
|
+
servers = raw
|
231
|
+
for server in servers
|
232
|
+
@_servers << Saklient::Cloud::Resources::GslbServer.new(server)
|
233
|
+
end
|
233
234
|
end
|
234
235
|
end
|
235
236
|
end
|
@@ -7,6 +7,7 @@ require_relative '../client'
|
|
7
7
|
require_relative 'resource'
|
8
8
|
require_relative 'swytch'
|
9
9
|
require_relative 'iface_activity'
|
10
|
+
require_relative '../models/model_swytch'
|
10
11
|
|
11
12
|
module Saklient
|
12
13
|
module Cloud
|
@@ -176,6 +177,14 @@ module Saklient
|
|
176
177
|
return reload
|
177
178
|
end
|
178
179
|
|
180
|
+
# 接続先のスイッチを取得します.
|
181
|
+
#
|
182
|
+
# @return [Swytch]
|
183
|
+
def find_swytch
|
184
|
+
model = Saklient::Util::create_class_instance('saklient.cloud.models.Model_Swytch', [@_client])
|
185
|
+
return model.get_by_id(self.swytch_id)
|
186
|
+
end
|
187
|
+
|
179
188
|
protected
|
180
189
|
|
181
190
|
# @return [bool]
|
@@ -2,19 +2,24 @@
|
|
2
2
|
|
3
3
|
# This code is automatically transpiled by Saklient Translator
|
4
4
|
|
5
|
+
require_relative '../../errors/http_not_found_exception'
|
5
6
|
require_relative '../../errors/http_exception'
|
6
7
|
require_relative '../../errors/saklient_exception'
|
7
8
|
require_relative '../client'
|
8
9
|
require_relative 'resource'
|
9
10
|
require_relative 'icon'
|
11
|
+
require_relative 'archive'
|
10
12
|
require_relative 'disk'
|
13
|
+
require_relative 'disk_config'
|
11
14
|
require_relative 'iface'
|
12
15
|
require_relative 'server_plan'
|
13
16
|
require_relative 'server_instance'
|
14
17
|
require_relative 'iso_image'
|
18
|
+
require_relative 'ipv4_net'
|
15
19
|
require_relative 'server_activity'
|
16
20
|
require_relative '../enums/eserver_instance_status'
|
17
21
|
require_relative '../enums/eavailability'
|
22
|
+
require_relative '../models/model_server'
|
18
23
|
require_relative '../models/model_disk'
|
19
24
|
require_relative '../models/model_iface'
|
20
25
|
|
@@ -67,6 +72,11 @@ module Saklient
|
|
67
72
|
# @return [ServerInstance]
|
68
73
|
attr_accessor :m_instance
|
69
74
|
|
75
|
+
# ホスト名
|
76
|
+
#
|
77
|
+
# @return [String]
|
78
|
+
attr_accessor :m_host_name
|
79
|
+
|
70
80
|
# 有効状態 {Saklient::Cloud::Enums::EAvailability}
|
71
81
|
#
|
72
82
|
# @return [String]
|
@@ -153,6 +163,144 @@ module Saklient
|
|
153
163
|
api_deserialize(obj, wrapped)
|
154
164
|
end
|
155
165
|
|
166
|
+
# サーバ および そのサーバに接続されている1台目のディスクを複製し, 同一ネットワークに接続します.
|
167
|
+
# ディスクのコピー中は待機し, 完了してからreturnします.
|
168
|
+
#
|
169
|
+
# 共有セグメントに接続されている場合はAPIによって自動的に割り当てられるため, 省略またはnullを指定してください.
|
170
|
+
# trueを指定した場合は, 複製元の現在のディスク#1から直接クローンします.
|
171
|
+
# 省略またはnullを指定した場合は, 複製元のディスク#1が作成された時のコピー元リソースから再度クローンを試みます.
|
172
|
+
# 既に削除されている場合は, 複製元の現在のディスク#1からの直接クローンにフォールバックします.
|
173
|
+
# いずれの場合も, 作成されるディスクのプランとサイズは複製元のサーバの1台目のディスクと同一のものが選択されます.
|
174
|
+
# 作成されるディスクは1台目だけで, 2台目以降は無視されます.
|
175
|
+
#
|
176
|
+
# @param [String] userIpAddress 最初のインタフェースに割り当てるIPアドレスを指定します.
|
177
|
+
# @param [any] diskSource ディスク#1のクローン元リソース(DiskまたはArchive)を指定します. 見つからないときは例外が発生します.
|
178
|
+
# @param hostname 新しいサーバのホスト名(自動的にホスト名をつける場合は省略またはnullを指定)
|
179
|
+
# @param [String] name 新しいサーバの名前(自動的に名前をつける場合は省略またはnullを指定)
|
180
|
+
# @param [String] sshKey
|
181
|
+
# @param [String] hostName
|
182
|
+
# @return [Server]
|
183
|
+
def easy_duplicate(userIpAddress = nil, diskSource = nil, sshKey = nil, hostName = nil, name = nil)
|
184
|
+
Saklient::Util::validate_type(userIpAddress, 'String')
|
185
|
+
Saklient::Util::validate_type(sshKey, 'String')
|
186
|
+
Saklient::Util::validate_type(hostName, 'String')
|
187
|
+
Saklient::Util::validate_type(name, 'String')
|
188
|
+
server = Saklient::Cloud::Resources::Server.new(@_client, nil)
|
189
|
+
names = []
|
190
|
+
hostNames = []
|
191
|
+
if (name).nil? || (hostName).nil?
|
192
|
+
model = Saklient::Util::create_class_instance('saklient.cloud.models.Model_Server', [@_client])
|
193
|
+
servers = model.limit(0).find
|
194
|
+
s = nil
|
195
|
+
for s in servers
|
196
|
+
names << s.get_name
|
197
|
+
hostNames << s.get_host_name
|
198
|
+
end
|
199
|
+
end
|
200
|
+
name = Saklient::Util::auto_rename(self.name, names) if (name).nil?
|
201
|
+
hostName = Saklient::Util::auto_rename(self.host_name, hostNames) if (hostName).nil?
|
202
|
+
server.set_name(name)
|
203
|
+
server.set_host_name(hostName)
|
204
|
+
server.set_description(self.description)
|
205
|
+
server.set_tags(self.tags)
|
206
|
+
server.set_icon(self.icon)
|
207
|
+
server.set_plan(self.plan)
|
208
|
+
iface = nil
|
209
|
+
if 0 < self.ifaces.length
|
210
|
+
iface = self.ifaces[0]
|
211
|
+
iface.reload
|
212
|
+
if (iface.ip_address).nil?
|
213
|
+
raise Saklient::Errors::SaklientException.new('invalid_data', 'Setting an IP address to the disconnected interface is not allowed') if (userIpAddress).nil? && (iface.swytch_id).nil?
|
214
|
+
else
|
215
|
+
raise Saklient::Errors::SaklientException.new('invalid_data', 'Setting an IP address to the interface connected to a shared segment is not allowed') if !(userIpAddress).nil?
|
216
|
+
end
|
217
|
+
end
|
218
|
+
srcDisks = find_disks
|
219
|
+
if 0 < srcDisks.length
|
220
|
+
direct = Saklient::Util::are_same(diskSource, true)
|
221
|
+
if (diskSource).nil? || direct
|
222
|
+
diskSource = srcDisks[0].source
|
223
|
+
if !direct
|
224
|
+
if diskSource.is_a?(Saklient::Cloud::Resources::Archive)
|
225
|
+
begin
|
226
|
+
diskSource.reload
|
227
|
+
rescue Saklient::Errors::HttpNotFoundException
|
228
|
+
diskSource = srcDisks[0]
|
229
|
+
end
|
230
|
+
else
|
231
|
+
if diskSource.is_a?(Saklient::Cloud::Resources::Disk)
|
232
|
+
begin
|
233
|
+
diskSource.reload
|
234
|
+
rescue Saklient::Errors::HttpNotFoundException
|
235
|
+
diskSource = srcDisks[0]
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
if diskSource.is_a?(Saklient::Cloud::Resources::Archive)
|
242
|
+
diskSource.reload
|
243
|
+
else
|
244
|
+
diskSource.reload if diskSource.is_a?(Saklient::Cloud::Resources::Disk)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
server.save
|
248
|
+
disk = nil
|
249
|
+
if !(diskSource).nil? && diskSource.is_a?(Saklient::Cloud::Resources::Resource)
|
250
|
+
disk = Saklient::Cloud::Resources::Disk.new(@_client, nil)
|
251
|
+
disk.source = diskSource
|
252
|
+
disk.name = (name).nil? ? srcDisks[0].name : name
|
253
|
+
disk.description = srcDisks[0].description
|
254
|
+
disk.tags = srcDisks[0].tags
|
255
|
+
disk.icon = srcDisks[0].icon
|
256
|
+
disk.plan = srcDisks[0].plan
|
257
|
+
disk.size_mib = srcDisks[0].size_mib
|
258
|
+
disk.server = server
|
259
|
+
disk.save
|
260
|
+
end
|
261
|
+
iface1st = nil
|
262
|
+
userSwytch = nil
|
263
|
+
for iface in self.ifaces
|
264
|
+
iface.reload
|
265
|
+
newIface = server.add_iface
|
266
|
+
if (iface1st).nil?
|
267
|
+
if !(iface.ip_address).nil?
|
268
|
+
newIface.connect_to_shared_segment
|
269
|
+
else
|
270
|
+
newIface.connect_to_swytch_by_id(iface.swytch_id) if !(iface.swytch_id).nil?
|
271
|
+
if !(userIpAddress).nil?
|
272
|
+
newIface.user_ip_address = userIpAddress
|
273
|
+
newIface.save
|
274
|
+
end
|
275
|
+
userSwytch = iface.find_swytch
|
276
|
+
iface1st = iface
|
277
|
+
end
|
278
|
+
else
|
279
|
+
newIface.connect_to_swytch_by_id(iface.swytch_id) if !(iface.swytch_id).nil?
|
280
|
+
end
|
281
|
+
end
|
282
|
+
if !(disk).nil?
|
283
|
+
disk.sleep_while_copying
|
284
|
+
diskconf = disk.create_config
|
285
|
+
diskconf.host_name = hostName
|
286
|
+
diskconf.ssh_key = sshKey
|
287
|
+
diskconf.ip_address = userIpAddress
|
288
|
+
if !(userSwytch).nil?
|
289
|
+
if 0 < userSwytch.ipv4_nets.length
|
290
|
+
net = userSwytch.ipv4_nets[0]
|
291
|
+
diskconf.default_route = net.default_route
|
292
|
+
diskconf.network_mask_len = net.mask_len
|
293
|
+
else
|
294
|
+
diskconf.default_route = userSwytch.user_default_route
|
295
|
+
diskconf.network_mask_len = userSwytch.user_mask_len
|
296
|
+
end
|
297
|
+
end
|
298
|
+
diskconf.write
|
299
|
+
end
|
300
|
+
server.reload
|
301
|
+
return server
|
302
|
+
end
|
303
|
+
|
156
304
|
protected
|
157
305
|
|
158
306
|
# @private
|
@@ -162,11 +310,13 @@ module Saklient
|
|
162
310
|
def _on_before_api_deserialize(r, root)
|
163
311
|
return nil if (r).nil?
|
164
312
|
id = r[:ID]
|
165
|
-
ifaces = r
|
313
|
+
ifaces = Saklient::Util::get_by_path(r, 'Interfaces')
|
166
314
|
if !(ifaces).nil?
|
167
315
|
for iface in ifaces
|
168
|
-
server =
|
169
|
-
if
|
316
|
+
server = nil
|
317
|
+
if !iface.nil? && iface.key?(:Server)
|
318
|
+
server = iface[:Server]
|
319
|
+
else
|
170
320
|
server = {}
|
171
321
|
iface[:Server] = server
|
172
322
|
end
|
@@ -309,7 +459,9 @@ module Saklient
|
|
309
459
|
model = Saklient::Util::create_class_instance('saklient.cloud.models.Model_Iface', [@_client])
|
310
460
|
res = model.create
|
311
461
|
res.server_id = _id
|
312
|
-
|
462
|
+
res.save
|
463
|
+
reload
|
464
|
+
return res
|
313
465
|
end
|
314
466
|
|
315
467
|
# サーバにISOイメージを挿入します.
|
@@ -335,6 +487,35 @@ module Saklient
|
|
335
487
|
return self
|
336
488
|
end
|
337
489
|
|
490
|
+
# サーバに接続されているコピー中のディスクが利用可能になるまで待機します.
|
491
|
+
#
|
492
|
+
# @param [Fixnum] timeoutSec
|
493
|
+
# @return [bool] 成功時はtrue, タイムアウトやエラーによる失敗時はfalseを返します.
|
494
|
+
def sleep_while_copying(timeoutSec = 3600)
|
495
|
+
Saklient::Util::validate_type(timeoutSec, 'Fixnum')
|
496
|
+
step = 10
|
497
|
+
disks = find_disks
|
498
|
+
while 0 < timeoutSec do
|
499
|
+
disk = nil
|
500
|
+
begin
|
501
|
+
reload
|
502
|
+
for disk in disks
|
503
|
+
disk.reload
|
504
|
+
end
|
505
|
+
rescue Saklient::Errors::HttpException
|
506
|
+
{}
|
507
|
+
end
|
508
|
+
result = get_availability == Saklient::Cloud::Enums::EAvailability::available
|
509
|
+
for disk in disks
|
510
|
+
result = false if disk.availability != Saklient::Cloud::Enums::EAvailability::available
|
511
|
+
end
|
512
|
+
return true if result
|
513
|
+
timeoutSec -= step
|
514
|
+
sleep(step) if 0 < timeoutSec
|
515
|
+
end
|
516
|
+
return false
|
517
|
+
end
|
518
|
+
|
338
519
|
protected
|
339
520
|
|
340
521
|
# @return [bool]
|
@@ -611,6 +792,46 @@ module Saklient
|
|
611
792
|
|
612
793
|
protected
|
613
794
|
|
795
|
+
# @return [bool]
|
796
|
+
attr_accessor :n_host_name
|
797
|
+
|
798
|
+
# (This method is generated in Translator_default#buildImpl)
|
799
|
+
#
|
800
|
+
# @private
|
801
|
+
# @return [String]
|
802
|
+
def get_host_name
|
803
|
+
return @m_host_name
|
804
|
+
end
|
805
|
+
|
806
|
+
# (This method is generated in Translator_default#buildImpl)
|
807
|
+
#
|
808
|
+
# @private
|
809
|
+
# @param [String] v
|
810
|
+
# @return [String]
|
811
|
+
def set_host_name(v)
|
812
|
+
Saklient::Util::validate_type(v, 'String')
|
813
|
+
@m_host_name = v
|
814
|
+
@n_host_name = true
|
815
|
+
return @m_host_name
|
816
|
+
end
|
817
|
+
|
818
|
+
public
|
819
|
+
|
820
|
+
# ホスト名
|
821
|
+
#
|
822
|
+
# @return [String]
|
823
|
+
attr_accessor :host_name
|
824
|
+
|
825
|
+
def host_name
|
826
|
+
get_host_name
|
827
|
+
end
|
828
|
+
|
829
|
+
def host_name=(v)
|
830
|
+
set_host_name(v)
|
831
|
+
end
|
832
|
+
|
833
|
+
protected
|
834
|
+
|
614
835
|
# @return [bool]
|
615
836
|
attr_accessor :n_availability
|
616
837
|
|
@@ -716,6 +937,13 @@ module Saklient
|
|
716
937
|
@is_incomplete = true
|
717
938
|
end
|
718
939
|
@n_instance = false
|
940
|
+
if Saklient::Util::exists_path(r, 'HostName')
|
941
|
+
@m_host_name = (Saklient::Util::get_by_path(r, 'HostName')).nil? ? nil : Saklient::Util::get_by_path(r, 'HostName').to_s
|
942
|
+
else
|
943
|
+
@m_host_name = nil
|
944
|
+
@is_incomplete = true
|
945
|
+
end
|
946
|
+
@n_host_name = false
|
719
947
|
if Saklient::Util::exists_path(r, 'Availability')
|
720
948
|
@m_availability = (Saklient::Util::get_by_path(r, 'Availability')).nil? ? nil : Saklient::Util::get_by_path(r, 'Availability').to_s
|
721
949
|
else
|
@@ -762,6 +990,7 @@ module Saklient
|
|
762
990
|
end
|
763
991
|
end
|
764
992
|
Saklient::Util::set_by_path(ret, 'Instance', withClean ? ((@m_instance).nil? ? nil : @m_instance.api_serialize(withClean)) : ((@m_instance).nil? ? { ID: '0' } : @m_instance.api_serialize_id)) if withClean || @n_instance
|
993
|
+
Saklient::Util::set_by_path(ret, 'HostName', @m_host_name) if withClean || @n_host_name
|
765
994
|
Saklient::Util::set_by_path(ret, 'Availability', @m_availability) if withClean || @n_availability
|
766
995
|
raise Saklient::Errors::SaklientException.new('required_field', 'Required fields must be set before the Server creation: ' + missing.join(', ')) if missing.length > 0
|
767
996
|
return ret
|
data/lib/saklient/util.rb
CHANGED
@@ -154,6 +154,29 @@ module Saklient
|
|
154
154
|
end
|
155
155
|
raise Saklient::Errors::SaklientException.new('argument_type_mismatch', 'Argument type mismatch (expected '+typeName+' but got '+clazz+')') unless isOk
|
156
156
|
end
|
157
|
+
|
158
|
+
def self.are_same(a, b)
|
159
|
+
return a.equal?(b)
|
160
|
+
end
|
161
|
+
|
162
|
+
def self.auto_rename(name, candidates)
|
163
|
+
m = /^(.*?)(\d+)(\W*)$/.match(name)
|
164
|
+
if m then
|
165
|
+
max = 0
|
166
|
+
len = 0
|
167
|
+
for c in candidates
|
168
|
+
n = /^(.*?)(\d+)(\W*)$/.match(c)
|
169
|
+
next unless n
|
170
|
+
next unless m[1]==n[1] and m[3]==n[3]
|
171
|
+
max = [max, n[2].to_i].max
|
172
|
+
len = [len, n[2].length].max
|
173
|
+
end
|
174
|
+
if 0 < len
|
175
|
+
return sprintf("%s%0" + len.to_s + "d%s", m[1], max+1, m[3])
|
176
|
+
end
|
177
|
+
end
|
178
|
+
return name + "-2"
|
179
|
+
end
|
157
180
|
|
158
181
|
end
|
159
182
|
|
data/lib/saklient/version.rb
CHANGED
data/spec/server_spec.rb
CHANGED
@@ -3,6 +3,16 @@ require 'saklient/cloud/api'
|
|
3
3
|
require 'date'
|
4
4
|
require 'SecureRandom'
|
5
5
|
|
6
|
+
TESTS_EASY_DUPLICATE = true
|
7
|
+
TESTS_DISK_EXPANSION = false
|
8
|
+
|
9
|
+
BREAKS_AFTER_SERVER_UP = false
|
10
|
+
BREAKS_AFTER_EASY_DUPLICATE = true
|
11
|
+
|
12
|
+
USE_READYMADE_SERVER_ID = 112800244655 # For TESTS_EASY_DUPLICATE
|
13
|
+
|
14
|
+
|
15
|
+
|
6
16
|
describe 'Server' do
|
7
17
|
|
8
18
|
|
@@ -77,160 +87,205 @@ describe 'Server' do
|
|
77
87
|
ssh_private_key_file = File.dirname(__dir__) + '/test-sshkey.txt'
|
78
88
|
password = SecureRandom.uuid[0, 8]
|
79
89
|
|
80
|
-
|
81
|
-
|
82
|
-
tests_disk_expansion = false
|
83
|
-
breaks_after_server_up = false
|
84
|
-
|
85
|
-
# search archives
|
86
|
-
puts 'searching archives...'
|
87
|
-
archives = @api.archive.with_name_like('CentOS 64bit').with_size_gib(20).with_shared_scope.limit(1).find
|
88
|
-
expect(archives.length).to be > 0
|
89
|
-
# printf "found %d archive(s)\n", archives.length
|
90
|
-
archive = archives[0]
|
91
|
-
expect(archive.id.to_i).to be > 0
|
92
|
-
# p archive.dump
|
93
|
-
|
94
|
-
# search scripts
|
95
|
-
puts 'searching scripts...'
|
96
|
-
scripts = @api.script.with_name_like('WordPress').with_shared_scope.limit(1).find
|
97
|
-
# printf "found %d script(s)\n", scripts.length
|
98
|
-
script = scripts[0]
|
99
|
-
# p script.dump
|
90
|
+
server = nil
|
91
|
+
disk = nil
|
100
92
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
disk.name = '!ruby_rspec-' + DateTime.now.strftime('%Y%m%d_%H%M%S') + '-' + SecureRandom.uuid[0, 8]
|
112
|
-
disk.description = 'This instance was created by saklient.ruby rspec'
|
113
|
-
disk.tags = ['saklient-test']
|
114
|
-
disk.plan = @api.product.disk.ssd
|
115
|
-
disk.source = archive
|
116
|
-
disk.save
|
117
|
-
# p disk.dump
|
93
|
+
if !USE_READYMADE_SERVER_ID.nil? then
|
94
|
+
|
95
|
+
server = @api.server.get_by_id(USE_READYMADE_SERVER_ID)
|
96
|
+
name = server.name
|
97
|
+
host_name = server.host_name
|
98
|
+
description = server.description
|
99
|
+
disks = server.find_disks()
|
100
|
+
disk = disks[0]
|
101
|
+
|
102
|
+
else
|
118
103
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
104
|
+
# options
|
105
|
+
additional_ssh_public_key = File.open(ENV['HOME'] + '/.ssh/id_rsa.pub').read.strip
|
106
|
+
|
107
|
+
# search archives
|
108
|
+
puts 'searching archives...'
|
109
|
+
archives = @api.archive.with_name_like('CentOS 64bit').with_size_gib(20).with_shared_scope.limit(1).find
|
110
|
+
expect(archives.length).to be > 0
|
111
|
+
# printf "found %d archive(s)\n", archives.length
|
112
|
+
archive = archives[0]
|
113
|
+
expect(archive.id.to_i).to be > 0
|
114
|
+
# p archive.dump
|
115
|
+
|
116
|
+
# search scripts
|
117
|
+
puts 'searching scripts...'
|
118
|
+
scripts = @api.script.with_name_like('WordPress').with_shared_scope.limit(1).find
|
119
|
+
# printf "found %d script(s)\n", scripts.length
|
120
|
+
script = scripts[0]
|
121
|
+
# p script.dump
|
122
|
+
|
123
|
+
# create a disk
|
124
|
+
puts 'creating a disk...'
|
125
|
+
disk = @api.disk.create
|
126
|
+
ok = false
|
127
|
+
begin
|
128
|
+
disk.save
|
129
|
+
rescue Saklient::Errors::SaklientException
|
130
|
+
ok = true
|
131
|
+
end
|
132
|
+
fail 'Requiredフィールドが未set時は SaklientException がスローされなければなりません' unless ok
|
133
|
+
disk.name = '!ruby_rspec-' + DateTime.now.strftime('%Y%m%d_%H%M%S') + '-' + SecureRandom.uuid[0, 8]
|
134
|
+
disk.description = 'This instance was created by saklient.ruby rspec'
|
135
|
+
disk.tags = ['saklient-test']
|
136
|
+
disk.plan = @api.product.disk.ssd
|
137
|
+
disk.source = archive
|
124
138
|
disk.save
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
begin
|
139
|
+
# p disk.dump
|
140
|
+
|
141
|
+
# check an immutable field
|
142
|
+
puts 'updating the disk...'
|
143
|
+
ok = false
|
144
|
+
begin
|
145
|
+
disk.size_mib = 20480
|
146
|
+
disk.save
|
147
|
+
rescue Saklient::Errors::SaklientException
|
148
|
+
ok = true
|
149
|
+
end
|
150
|
+
fail 'Immutableフィールドの再set時は SaklientException がスローされなければなりません' unless ok
|
151
|
+
|
152
|
+
# create a server
|
153
|
+
puts 'creating a server...'
|
154
|
+
server = @api.server.create
|
155
|
+
expect(server).to be_an_instance_of Saklient::Cloud::Resources::Server
|
156
|
+
server.name = name
|
157
|
+
server.description = description
|
158
|
+
server.tags = [tag]
|
159
|
+
server.plan = @api.product.server.get_by_spec(cpu, mem)
|
160
|
+
server.save
|
161
|
+
|
162
|
+
# check the server properties
|
163
|
+
expect(server.id.to_i).to be > 0
|
164
|
+
expect(server.name).to eq name
|
165
|
+
expect(server.description).to eq description
|
166
|
+
expect(server.tags).to be_an_instance_of Array
|
167
|
+
expect(server.tags.length).to eq 1
|
168
|
+
expect(server.tags[0]).to eq tag
|
169
|
+
expect(server.plan.cpu).to eq cpu
|
170
|
+
expect(server.plan.memory_gib).to eq mem
|
171
|
+
|
172
|
+
# connect to shared segment
|
173
|
+
puts 'connecting the server to shared segment...'
|
174
|
+
iface = server.add_iface
|
175
|
+
expect(iface).to be_an_instance_of Saklient::Cloud::Resources::Iface
|
176
|
+
expect(iface.id.to_i).to be > 0
|
177
|
+
iface.connect_to_shared_segment
|
178
|
+
|
179
|
+
# wait disk copy
|
180
|
+
puts 'waiting disk copy...'
|
181
|
+
fail 'アーカイブからディスクへのコピーがタイムアウトしました' unless disk.sleep_while_copying
|
182
|
+
# p disk.dump
|
183
|
+
disk.source = nil
|
184
|
+
disk.reload
|
185
|
+
expect(disk.source).to be_an_instance_of Saklient::Cloud::Resources::Archive
|
186
|
+
expect(disk.source.id).to eq archive.id
|
187
|
+
expect(disk.size_gib).to eq archive.size_gib
|
188
|
+
|
189
|
+
# connect the disk to the server
|
190
|
+
puts 'connecting the disk to the server...'
|
191
|
+
disk.connect_to(server)
|
192
|
+
server.reload
|
193
|
+
ip_address = server.ifaces[0].ip_address
|
194
|
+
puts 'server IP address: ' + ip_address
|
195
|
+
puts 'server password: ' + password
|
196
|
+
expect(ip_address).not_to be_empty
|
197
|
+
|
198
|
+
# config the disk
|
199
|
+
puts 'writing configuration to the disk...'
|
200
|
+
diskconf = disk.create_config
|
201
|
+
diskconf.host_name = 'saklient-test'
|
202
|
+
diskconf.password = password
|
203
|
+
diskconf.ssh_key = ssh_public_key
|
204
|
+
diskconf.ssh_keys.unshift(additional_ssh_public_key) if !additional_ssh_public_key.empty?
|
205
|
+
diskconf.scripts.push(script)
|
206
|
+
diskconf.write
|
207
|
+
|
208
|
+
# boot
|
209
|
+
puts 'booting the server...'
|
197
210
|
server.boot
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
211
|
+
sleep 3
|
212
|
+
server.reload
|
213
|
+
expect(server.instance.status).to eq Saklient::Cloud::Enums::EServerInstanceStatus::up
|
214
|
+
|
215
|
+
# boot conflict
|
216
|
+
puts 'checking the server power conflicts...'
|
217
|
+
ok = false
|
218
|
+
begin
|
219
|
+
server.boot
|
220
|
+
rescue Saklient::Errors::HttpConflictException
|
221
|
+
ok = true
|
222
|
+
end
|
223
|
+
fail 'サーバ起動中の起動試行時は HttpConflictException がスローされなければなりません' unless ok
|
224
|
+
|
225
|
+
# ssh
|
226
|
+
cmd = '| ssh -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -i' + ssh_private_key_file +
|
227
|
+
' root@' + ip_address + ' hostname 2>/dev/null'
|
228
|
+
ssh_success = false
|
229
|
+
puts 'trying to SSH to the server...'
|
230
|
+
for i in 0..9 do
|
231
|
+
sleep 5
|
232
|
+
sh = open cmd
|
233
|
+
host_name_got = ''
|
234
|
+
while !sh.eof
|
235
|
+
host_name_got += sh.gets
|
236
|
+
end
|
237
|
+
sh.close
|
238
|
+
host_name_got.strip!
|
239
|
+
next unless host_name == host_name_got
|
240
|
+
ssh_success = true
|
241
|
+
break
|
242
|
+
end
|
243
|
+
fail '作成したサーバへ正常にSSHできません' unless ssh_success
|
244
|
+
|
245
|
+
fail 'SSHに成功後、処理を中断しました' if BREAKS_AFTER_SERVER_UP
|
246
|
+
|
247
|
+
# stop
|
248
|
+
sleep 1
|
249
|
+
puts 'stopping the server...'
|
250
|
+
server.stop
|
251
|
+
fail 'サーバが正常に停止しません' unless server.sleep_until_down
|
252
|
+
|
253
|
+
# activity
|
254
|
+
for sample in server.activity.fetch.samples do
|
255
|
+
expect(sample.at).to be_an_instance_of DateTime
|
214
256
|
end
|
215
|
-
|
216
|
-
host_name_got.strip!
|
217
|
-
next unless host_name == host_name_got
|
218
|
-
ssh_success = true
|
219
|
-
break
|
257
|
+
|
220
258
|
end
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
expect(
|
259
|
+
|
260
|
+
if TESTS_EASY_DUPLICATE
|
261
|
+
puts 'running easy duplicate...'
|
262
|
+
server2 = server.easy_duplicate()
|
263
|
+
|
264
|
+
# check the server properties
|
265
|
+
expect(server2.id.to_i).to be > 0
|
266
|
+
expect(server2.name.gsub(/-\d+/, '')).to eq name.gsub(/-\d+/, '')
|
267
|
+
expect(server2.host_name.gsub(/-\d+/, '')).to eq host_name.gsub(/-\d+/, '')
|
268
|
+
expect(server2.description).to eq description
|
269
|
+
expect(server2.tags).to be_an_instance_of Array
|
270
|
+
expect(server2.tags.length).to eq 1
|
271
|
+
expect(server2.tags[0]).to eq tag
|
272
|
+
expect(server2.plan.cpu).to eq cpu
|
273
|
+
expect(server2.plan.memory_gib).to eq mem
|
274
|
+
|
275
|
+
expect(server2.ifaces.length).to eq 1
|
276
|
+
expect(server2.ifaces[0]).to be_an_instance_of Saklient::Cloud::Resources::Iface
|
277
|
+
expect(server2.ifaces[0].id.to_i).to be > 0
|
278
|
+
expect(server2.ifaces[0].ip_address).not_to eq server.ifaces[0].ip_address
|
279
|
+
|
280
|
+
disks2 = server2.find_disks()
|
281
|
+
expect(disks2.length).to eq 1
|
282
|
+
expect(disks2[0].size_gib).to eq disk.size_gib
|
283
|
+
expect(disks2[0].source.id).to eq disk.source.id
|
284
|
+
|
285
|
+
next if BREAKS_AFTER_EASY_DUPLICATE
|
286
|
+
|
287
|
+
disks2[0].destroy()
|
288
|
+
server2.destroy()
|
234
289
|
end
|
235
290
|
|
236
291
|
# disconnect the disk from the server
|
@@ -241,7 +296,7 @@ describe 'Server' do
|
|
241
296
|
puts 'deleting the server...'
|
242
297
|
server.destroy
|
243
298
|
|
244
|
-
if
|
299
|
+
if TESTS_DISK_EXPANSION
|
245
300
|
|
246
301
|
# duplicate the disk
|
247
302
|
puts 'duplicating the disk (expanding to 40GiB)...'
|
data/spec/util_spec.rb
CHANGED
@@ -97,4 +97,24 @@ describe 'Util' do
|
|
97
97
|
|
98
98
|
end
|
99
99
|
|
100
|
+
it 'should access objects by path' do
|
101
|
+
candidates = [
|
102
|
+
"server-00001",
|
103
|
+
"server-00005",
|
104
|
+
"server-00030",
|
105
|
+
"swytch-00040",
|
106
|
+
"名称未設定 (1234)",
|
107
|
+
"名称未設定 (567)",
|
108
|
+
"0000099999",
|
109
|
+
"xxx99999",
|
110
|
+
]
|
111
|
+
expect(Util::auto_rename("server-00001", candidates)).to eq "server-00031"
|
112
|
+
expect(Util::auto_rename("server-00005", candidates)).to eq "server-00031"
|
113
|
+
expect(Util::auto_rename("swytch-00005", candidates)).to eq "swytch-00041"
|
114
|
+
expect(Util::auto_rename("名称未設定 (1234)", candidates)).to eq "名称未設定 (1235)"
|
115
|
+
expect(Util::auto_rename("名称未設定 (567)", candidates)).to eq "名称未設定 (1235)"
|
116
|
+
expect(Util::auto_rename("0000099999", candidates)).to eq "0000100000"
|
117
|
+
expect(Util::auto_rename("xxx99999", candidates)).to eq "xxx100000"
|
118
|
+
end
|
119
|
+
|
100
120
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saklient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- townewgokgok
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -317,4 +317,3 @@ test_files:
|
|
317
317
|
- spec/server_spec.rb
|
318
318
|
- spec/swytch_spec.rb
|
319
319
|
- spec/util_spec.rb
|
320
|
-
has_rdoc:
|