Class: Saklient::Cloud::Resources::Server

Inherits:
Resource
  • Object
show all
Defined in:
lib/saklient/cloud/resources/server.rb

Overview

サーバの実体1つに対応し, 属性の取得や操作を行うためのクラス.

Instance Attribute Summary collapse

Attributes inherited from Resource

#client

Instance Method Summary collapse

Methods inherited from Resource

#api_deserialize, #api_serialize, create_with, #destroy, #dump, #exists, #request_retry, #set_param

Constructor Details

#initialize(client, obj, wrapped = false) ⇒ Server

Returns a new instance of Server.

Parameters:



158
159
160
161
162
163
164
# File 'lib/saklient/cloud/resources/server.rb', line 158

def initialize(client, obj, wrapped = false)
  super(client)
  Saklient::Util::validate_type(client, 'Saklient::Cloud::Client')
  Saklient::Util::validate_type(wrapped, 'bool')
  @_activity = Saklient::Cloud::Resources::ServerActivity.new(client)
  api_deserialize(obj, wrapped)
end

Instance Attribute Details

#activityServerActivity (readonly)

アクティビティ

Returns:



148
149
150
# File 'lib/saklient/cloud/resources/server.rb', line 148

def activity
  @activity
end

#availabilityString (readonly)

有効状態 Enums::EAvailability

Returns:

  • (String)


863
864
865
# File 'lib/saklient/cloud/resources/server.rb', line 863

def availability
  @availability
end

#descriptionString

説明

Returns:

  • (String)


625
626
627
# File 'lib/saklient/cloud/resources/server.rb', line 625

def description
  @description
end

#host_nameString

ホスト名

Returns:

  • (String)


835
836
837
# File 'lib/saklient/cloud/resources/server.rb', line 835

def host_name
  @host_name
end

#iconIcon

アイコン

Returns:



706
707
708
# File 'lib/saklient/cloud/resources/server.rb', line 706

def icon
  @icon
end

#idString (readonly)

ID

Returns:

  • (String)


549
550
551
# File 'lib/saklient/cloud/resources/server.rb', line 549

def id
  @id
end

#ifacesArray<Iface> (readonly)

インタフェース

Returns:



775
776
777
# File 'lib/saklient/cloud/resources/server.rb', line 775

def ifaces
  @ifaces
end

#instanceServerInstance (readonly)

インスタンス情報

Returns:



799
800
801
# File 'lib/saklient/cloud/resources/server.rb', line 799

def instance
  @instance
end

#nameString

名前

Returns:

  • (String)


585
586
587
# File 'lib/saklient/cloud/resources/server.rb', line 585

def name
  @name
end

#planServerPlan

プラン

Returns:



747
748
749
# File 'lib/saklient/cloud/resources/server.rb', line 747

def plan
  @plan
end

#tagsArray<String>

タグ文字列の配列

Returns:

  • (Array<String>)


666
667
668
# File 'lib/saklient/cloud/resources/server.rb', line 666

def tags
  @tags
end

Instance Method Details

#_class_nameString

Returns:

  • (String)


107
108
109
# File 'lib/saklient/cloud/resources/server.rb', line 107

def _class_name
  return 'Server'
end

#_idString

Returns:

  • (String)


113
114
115
# File 'lib/saklient/cloud/resources/server.rb', line 113

def _id
  return get_id
end

#add_ifaceIface

サーバにインタフェースを1つ増設し, それを取得します.

Returns:

  • (Iface)

    増設されたインタフェース



470
471
472
473
474
475
476
477
# File 'lib/saklient/cloud/resources/server.rb', line 470

def add_iface
  model = Saklient::Util::create_class_instance('saklient.cloud.models.Model_Iface', [@_client])
  res = model.create
  res.server_id = _id
  res.save
  reload
  return res
end

#bootServer

サーバを起動します.

Returns:



367
368
369
370
# File 'lib/saklient/cloud/resources/server.rb', line 367

def boot
  @_client.request('PUT', _api_path + '/' + Saklient::Util::url_encode(_id) + '/power')
  return reload
end

#change_plan(planTo) ⇒ Server

サーバプランを変更します.

成功時はリソースIDが変わることにご注意ください.

Parameters:

Returns:



451
452
453
454
455
456
457
# File 'lib/saklient/cloud/resources/server.rb', line 451

def change_plan(planTo)
  Saklient::Util::validate_type(planTo, 'Saklient::Cloud::Resources::ServerPlan')
  path = _api_path + '/' + Saklient::Util::url_encode(_id) + '/to/plan/' + Saklient::Util::url_encode(planTo._id)
  result = @_client.request('PUT', path)
  api_deserialize(result, true)
  return self
end

#easy_duplicate(userIpAddress = nil, diskSource = nil, sshKey = nil, hostName = nil, name = nil) ⇒ Server

サーバ および そのサーバに接続されている1台目のディスクを複製し, 同一ネットワークに接続します. ディスクのコピー中は待機し, 完了してからreturnします.

   共有セグメントに接続されている場合はAPIによって自動的に割り当てられるため, 省略またはnullを指定してください.
   文字列 "skip" を指定すると, ディスク修正処理をスキップします.
trueを指定した場合は, 複製元の現在のディスク#1から直接クローンします.
省略またはnullを指定した場合は, 複製元のディスク#1が作成された時のコピー元リソースから再度クローンを試みます.
既に削除されている場合は, 複製元の現在のディスク#1からの直接クローンにフォールバックします.
いずれの場合も, 作成されるディスクのプランとサイズは複製元のサーバの1台目のディスクと同一のものが選択されます.
作成されるディスクは1台目だけで, 2台目以降は無視されます.

Parameters:

  • userIpAddress (String) (defaults to: nil)

    最初のインタフェースに割り当てるIPアドレスを指定します.

  • diskSource (any) (defaults to: nil)

    ディスク#1のクローン元リソース(DiskまたはArchive)を指定します. 見つからないときは例外が発生します.

  • hostname

    新しいサーバのホスト名(自動的にホスト名をつける場合は省略またはnullを指定)

  • name (String) (defaults to: nil)

    新しいサーバの名前(自動的に名前をつける場合は省略またはnullを指定)

  • sshKey (String) (defaults to: nil)
  • hostName (String) (defaults to: nil)

Returns:



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
# File 'lib/saklient/cloud/resources/server.rb', line 184

def easy_duplicate(userIpAddress = nil, diskSource = nil, sshKey = nil, hostName = nil, name = nil)
  Saklient::Util::validate_type(userIpAddress, 'String')
  Saklient::Util::validate_type(sshKey, 'String')
  Saklient::Util::validate_type(hostName, 'String')
  Saklient::Util::validate_type(name, 'String')
  server = Saklient::Cloud::Resources::Server.new(@_client, nil)
  names = []
  hostNames = []
  skipConfig = userIpAddress == 'skip'
  userIpAddress = nil if skipConfig
  if (name).nil? || (hostName).nil?
    model = Saklient::Util::create_class_instance('saklient.cloud.models.Model_Server', [@_client])
    servers = model.limit(0).find
    s = nil
    for s in servers
      names << s.get_name
      hostNames << s.get_host_name
    end
  end
  name = Saklient::Util::auto_rename(self.name, names) if (name).nil?
  hostName = Saklient::Util::auto_rename(self.host_name, hostNames) if (hostName).nil?
  server.set_name(name)
  server.set_host_name(hostName)
  server.set_description(self.description)
  server.set_tags(self.tags)
  server.set_icon(self.icon)
  server.set_plan(self.plan)
  iface = nil
  if 0 < self.ifaces.length
    iface = self.ifaces[0]
    iface.reload
    if !(userIpAddress).nil?
      if (iface.ip_address).nil?
        raise Saklient::Errors::SaklientException.new('invalid_data', 'Setting an IP address to the disconnected interface is not allowed') if (iface.swytch_id).nil?
      else
        raise Saklient::Errors::SaklientException.new('invalid_data', 'Setting an IP address to the interface connected to a shared segment is not allowed')
      end
    end
  end
  srcDisks = find_disks
  if 0 < srcDisks.length
    if Saklient::Util::are_same(diskSource, true)
      diskSource = srcDisks[0]
    else
      if (diskSource).nil?
        diskSource = srcDisks[0].source
        if (diskSource).nil?
          diskSource = srcDisks[0]
        else
          if diskSource.is_a?(Saklient::Cloud::Resources::Archive)
            begin
              diskSource.reload
            rescue Saklient::Errors::HttpNotFoundException
              diskSource = srcDisks[0]
            end
          else
            if diskSource.is_a?(Saklient::Cloud::Resources::Disk)
              begin
                diskSource.reload
              rescue Saklient::Errors::HttpNotFoundException
                diskSource = srcDisks[0]
              end
            end
          end
        end
      end
    end
    if diskSource.is_a?(Saklient::Cloud::Resources::Archive)
      diskSource.reload
    else
      diskSource.reload if diskSource.is_a?(Saklient::Cloud::Resources::Disk)
    end
  end
  server.save
  disk = nil
  if !(diskSource).nil? && diskSource.is_a?(Saklient::Cloud::Resources::Resource)
    disk = Saklient::Cloud::Resources::Disk.new(@_client, nil)
    disk.source = diskSource
    disk.name = (name).nil? ? srcDisks[0].name : name
    disk.description = srcDisks[0].description
    disk.tags = srcDisks[0].tags
    disk.icon = srcDisks[0].icon
    disk.plan = srcDisks[0].plan
    disk.size_mib = srcDisks[0].size_mib
    disk.server = server
    disk.save
  end
  iface1st = nil
  userSwytch = nil
  for iface in self.ifaces
    iface.reload
    newIface = server.add_iface
    if (iface1st).nil?
      if !(iface.ip_address).nil?
        newIface.connect_to_shared_segment
      else
        newIface.connect_to_swytch_by_id(iface.swytch_id) if !(iface.swytch_id).nil?
        if !(userIpAddress).nil?
          newIface.user_ip_address = userIpAddress
          newIface.save
        end
        userSwytch = iface.find_swytch
        iface1st = iface
      end
    else
      newIface.connect_to_swytch_by_id(iface.swytch_id) if !(iface.swytch_id).nil?
    end
  end
  if !(disk).nil?
    disk.sleep_while_copying
    if !skipConfig
      diskconf = disk.create_config
      diskconf.host_name = hostName
      diskconf.ssh_key = sshKey
      diskconf.ip_address = userIpAddress
      if !(userSwytch).nil?
        if 0 < userSwytch.ipv4_nets.length
          net = userSwytch.ipv4_nets[0]
          diskconf.default_route = net.default_route
          diskconf.network_mask_len = net.mask_len
        else
          diskconf.default_route = userSwytch.user_default_route
          diskconf.network_mask_len = userSwytch.user_mask_len
        end
      end
      diskconf.write
    end
  end
  server.reload
  return server
end

#eject_iso_imageServer

サーバに挿入されているISOイメージを排出します.

Returns:



495
496
497
498
499
500
# File 'lib/saklient/cloud/resources/server.rb', line 495

def eject_iso_image
  path = _api_path + '/' + Saklient::Util::url_encode(_id) + '/cdrom'
  @_client.request('DELETE', path)
  reload
  return self
end

#find_disksArray<Disk>

サーバに接続されているディスクのリストを取得します.

Returns:



462
463
464
465
# File 'lib/saklient/cloud/resources/server.rb', line 462

def find_disks
  model = Saklient::Util::create_class_instance('saklient.cloud.models.Model_Disk', [@_client])
  return model.with_server_id(_id).sort_by_connection_order.find
end

#get_activityServerActivity

Returns:



141
142
143
# File 'lib/saklient/cloud/resources/server.rb', line 141

def get_activity
  return @_activity
end

#insert_iso_image(iso) ⇒ Server

サーバにISOイメージを挿入します.

Parameters:

Returns:



483
484
485
486
487
488
489
490
# File 'lib/saklient/cloud/resources/server.rb', line 483

def insert_iso_image(iso)
  Saklient::Util::validate_type(iso, 'Saklient::Cloud::Resources::IsoImage')
  path = _api_path + '/' + Saklient::Util::url_encode(_id) + '/cdrom'
  q = { CDROM: { ID: iso._id } }
  @_client.request('PUT', path, q)
  reload
  return self
end

#is_downbool

サーバが停止しているときtrueを返します.

Returns:

  • (bool)


360
361
362
# File 'lib/saklient/cloud/resources/server.rb', line 360

def is_down
  return get_instance.is_down
end

#is_upbool

サーバが起動しているときtrueを返します.

Returns:

  • (bool)


353
354
355
# File 'lib/saklient/cloud/resources/server.rb', line 353

def is_up
  return get_instance.is_up
end

#rebootServer

サーバを強制再起動します.

Returns:



391
392
393
394
# File 'lib/saklient/cloud/resources/server.rb', line 391

def reboot
  @_client.request('PUT', _api_path + '/' + Saklient::Util::url_encode(_id) + '/reset')
  return reload
end

#reloadServer

最新のリソース情報を再取得します.

Returns:



127
128
129
# File 'lib/saklient/cloud/resources/server.rb', line 127

def reload
  return _reload
end

#saveServer

このローカルオブジェクトに現在設定されているリソース情報をAPIに送信し, 新規作成または上書き保存します.

Returns:



120
121
122
# File 'lib/saklient/cloud/resources/server.rb', line 120

def save
  return _save
end

#shutdownServer

サーバをシャットダウンします.

Returns:



375
376
377
378
# File 'lib/saklient/cloud/resources/server.rb', line 375

def shutdown
  @_client.request('DELETE', _api_path + '/' + Saklient::Util::url_encode(_id) + '/power')
  return reload
end

#sleep_until_down(timeoutSec = 180) ⇒ bool

サーバが停止するまで待機します.

Parameters:

  • timeoutSec (Fixnum) (defaults to: 180)

Returns:

  • (bool)

    成功時はtrue, タイムアウトやエラーによる失敗時はfalseを返します.



409
410
411
412
# File 'lib/saklient/cloud/resources/server.rb', line 409

def sleep_until_down(timeoutSec = 180)
  Saklient::Util::validate_type(timeoutSec, 'Fixnum')
  return sleep_until(Saklient::Cloud::Enums::EServerInstanceStatus::down, timeoutSec)
end

#sleep_until_up(timeoutSec = 180) ⇒ bool

サーバが起動するまで待機します.

Parameters:

  • timeoutSec (Fixnum) (defaults to: 180)

Returns:

  • (bool)


400
401
402
403
# File 'lib/saklient/cloud/resources/server.rb', line 400

def sleep_until_up(timeoutSec = 180)
  Saklient::Util::validate_type(timeoutSec, 'Fixnum')
  return sleep_until(Saklient::Cloud::Enums::EServerInstanceStatus::up, timeoutSec)
end

#sleep_while_copying(timeoutSec = 3600) ⇒ bool

サーバに接続されているコピー中のディスクが利用可能になるまで待機します.

Parameters:

  • timeoutSec (Fixnum) (defaults to: 3600)

Returns:

  • (bool)

    成功時はtrue, タイムアウトやエラーによる失敗時はfalseを返します.



506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
# File 'lib/saklient/cloud/resources/server.rb', line 506

def sleep_while_copying(timeoutSec = 3600)
  Saklient::Util::validate_type(timeoutSec, 'Fixnum')
  step = 10
  disks = find_disks
  while 0 < timeoutSec do
    disk = nil
    begin
      reload
      for disk in disks
        disk.reload
      end
    rescue Saklient::Errors::HttpException
      {}
    end
    result = get_availability == Saklient::Cloud::Enums::EAvailability::available
    for disk in disks
      result = false if disk.availability != Saklient::Cloud::Enums::EAvailability::available
    end
    return true if result
    timeoutSec -= step
    sleep(step) if 0 < timeoutSec
  end
  return false
end

#stopServer

サーバを強制停止します.

Returns:



383
384
385
386
# File 'lib/saklient/cloud/resources/server.rb', line 383

def stop
  @_client.request('DELETE', _api_path + '/' + Saklient::Util::url_encode(_id) + '/power', { Force: true })
  return reload
end