Class: MOS::Client

Inherits:
Base
  • Object
show all
Defined in:
lib/mos-sdk.rb,
lib/mos-sdk.rb

Overview

基类函数为Base,mos-sdk的实现类

Instance Attribute Summary

Attributes inherited from Base

#access, #debug, #format, #secret, #timeout, #url

Instance Method Summary collapse

Methods inherited from Base

#_request, #get_signature, #parse_array_params, #raw_request, #request, #sha256_hmac, #string_to_sign

Constructor Details

#initialize(access, secret, url, format = 'xml', timeout = 300, debug = false) ⇒ Client

构造函数



13
14
15
# File 'lib/mos-sdk.rb', line 13

def initialize(access, secret, url, format='xml', timeout=300, debug=false)
  super(access, secret, url, format, timeout, debug)
end

Instance Method Details

#change_instance_type(iid, itype, duration = nil, datadisk = nil, bandwidth = nil) ⇒ Object

更改虚拟机类型

  • @param [String] iid 虚拟机ID

  • @param [String] itype 指定更改的虚拟机类型

  • @param [String] duration 指定更改后的初始租期,缺省为‘1M’,即一个月

  • @param [Integer] datadisk 指定创建虚拟机使用的额外数据盘,单位为1GB

  • @param [Integer] bandwidth 指定创建虚拟机使用的额外带宽,单位为Mbps

  • 省略datadisk和bandwidth参数无法成功修改,具体用法可参考对应测试样例



224
225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/mos-sdk.rb', line 224

def change_instance_type(iid, itype, duration=nil, datadisk=nil, bandwidth=nil)
  kwargs = {}
  kwargs['InstanceId'] = iid
  kwargs['InstanceType'] = itype
  unless duration.nil?
    /^\d+[HhMm]$/.match(duration) ? kwargs['Duration'] = duration : (raise Exception('Illegal duration format'))
  end

  kwargs['ExtraExtDisksize'] = datadisk unless datadisk.nil?
  kwargs['ExtraExtBandwidth'] = bandwidth unless bandwidth.nil?

  self.request('ChangeInstanceType', *kwargs)
end

#create_instance(imageid, itype, duration = nil, name = nil, keypair = nil, secgroup = nil, datadisk = nil, bandwidth = nil, zone = nil) ⇒ Object

创建虚拟机,创建时要提供datadisk和bandwidth参数

  • @param [String] imageid 系统模板ID

  • @param [String] itype 虚拟机类型ID 例如 C4_M4 代表四核 4G内存

  • @param [String] duration 虚拟机租期, 缺省为‘1M’,即一个月

  • @param [String] name 虚拟机名称(可选)

  • @param [String] keypair 虚拟机使用的SSH密钥ID

  • @param [Integer] datadisk 指定创建虚拟机使用的额外数据盘,单位为1GB

  • @param [Integer] bandwidth 指定创建虚拟机使用的额外带宽,单位为Mbps

  • @return [Hash] 创建成功的虚拟机信息



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/mos-sdk.rb', line 116

def create_instance(imageid, itype, duration=nil, name=nil, keypair=nil, secgroup=nil, datadisk=nil, bandwidth=nil, zone=nil)
  kwargs = {}
  kwargs['ImageId'] = imageid
  kwargs['InstanceType'] = itype
  unless duration.nil?
    /^\d+[HhMm]$/.match(duration) ? kwargs['Duration'] = duration : (raise Exception('Illegal duration format'))
  end

  kwargs['InstanceName'] = name unless name.nil?
  kwargs['KeyName'] = keypair unless keypair.nil?
  kwargs['ExtraExtDisksize'] = datadisk unless datadisk.nil?
  kwargs['ExtraExtBandwidth'] = bandwidth unless bandwidth.nil?
  kwargs['GroupId'] = secgroup unless secgroup.nil?
  kwargs['AvailabilityZoneId'] = zone unless zone.nil?
  val = self.request('CreateInstance', *kwargs)
  val['Instance']
end

#create_template(iid, name, notes = nil) ⇒ Object

保存虚拟机的模板

  • @param [String] iid 虚拟机ID

  • @param [String] name 模板名称

  • @param [String] notes 保存模板的说明

  • @return [Hash] 请求是否成功



302
303
304
305
306
307
308
# File 'lib/mos-sdk.rb', line 302

def create_template(iid, name, notes=nil)
  kwargs = {}
  kwargs['InstanceId'] = iid
  kwargs['Name'] = name
  kwargs['Notes'] = notes unless notes.nil?
  self.request('CreateTemplate', *kwargs)
end

#delete_key_pair(kid) ⇒ Object

删除一个SSH密钥对

  • @param [String] kid 密钥对ID



291
292
293
294
295
# File 'lib/mos-sdk.rb', line 291

def delete_key_pair(kid)
  kwargs = {}
  kwargs['KeyName'] = kid
  self.request('DeleteKeyPair', *kwargs)
end

#delete_template(tid) ⇒ Object

删除一个模板

  • @param [String] tid 模板ID



312
313
314
315
316
# File 'lib/mos-sdk.rb', line 312

def delete_template(tid)
  kwargs = {}
  kwargs['TemplateId'] = tid
  self.request('DeleteTemplate', *kwargs)
end

#describe_instance_status(iid) ⇒ Object

获取虚拟机的状态

  • @param [String] iid 虚拟机ID

  • @return [Hash] 虚拟机状态



137
138
139
140
141
142
# File 'lib/mos-sdk.rb', line 137

def describe_instance_status(iid)
  kwargs = {}
  kwargs['InstanceId'] = iid
  val = self.request('DescribeInstanceStatus', *kwargs)
  val['InstanceStatus']
end

#describe_instance_types(limit = 0, offset = 0, filters = nil) ⇒ Object

获取所有虚拟机类型

  • @param [Integer] limit 最大返回数量,用于分页控制

  • @param [Integer] offset 返回偏移量,用于分页控制

  • @param [Hash] filters 过滤条件,key/value分别指定过滤字段名称和值,支持的字段名称为:name, status

  • @return [Hash] 所有虚拟机信息



22
23
24
25
26
27
# File 'lib/mos-sdk.rb', line 22

def describe_instance_types(limit=0, offset=0, filters=nil)
  kwargs = {}
  self.parse_array_params(limit, offset, filters, kwargs) # parse_list_params  父类函数
  val = self.request('DescribeInstanceTypes', *kwargs)
  val['InstanceTypeSet']
end

#describe_instance_volumes(iid, limit = 0, offset = 0, filters = nil) ⇒ Object

获取指定虚拟机的虚拟磁盘信息

  • @param [String] iid 虚拟机ID

  • @param [Integer] limit 最大返回数量,用于分页控制

  • @param [Integer] offset 返回的偏移量,用于分页控制

  • @param [Hash] filters 返回结果过滤条件,由hash的key/value指定过滤字段名和值

  • @return [Hash] 指定虚拟机磁盘列表



64
65
66
67
68
69
70
# File 'lib/mos-sdk.rb', line 64

def describe_instance_volumes(iid, limit=0, offset=0, filters=nil)
  kwargs = {}
  kwargs['InstanceId'] = iid
  self.parse_array_params(limit, offset, filters, kwargs)
  val = self.request('DescribeInstanceVolumes', *kwargs)
  val['InstanceVolumeSet']
end

#describe_instances(ids = nil, names = nil, limit = 0, offset = 0, filters = nil) ⇒ Object

获得所有虚拟机

  • @param [Array] ids 期望获取的虚拟机ID列表

  • @param [Array] names 期望获取信息的虚拟机名称列表

  • @param [Integer] limit 最多返回数量

  • @param [Integer] offset 返回虚拟机的偏移量,用于分页显示

  • @param [Hash] filters 过滤器,一个hash,包含过滤字段名和值,可能过滤字段为:name, status

  • @return [Hash] 虚拟机列表



49
50
51
52
53
54
55
56
# File 'lib/mos-sdk.rb', line 49

def describe_instances(ids=nil, names=nil, limit=0, offset=0, filters=nil)
  kwargs = {}
  kwargs['InstanceId'] = ids if ids.kind_of?(Array) && ids.size() > 0
  kwargs['InstanceName'] = names if names.kind_of?(Array) && names.size() > 0
  self.parse_array_params(limit, offset, filters, kwargs)
  val = self.request('DescribeInstances', *kwargs)
  val['InstanceSet']
end

#describe_key_pairs(limit = 0, offset = 0, filters = nil) ⇒ Object

获取用户的SSH密钥对

  • @param [Integer] limit 最大返回数量,用于分页控制

  • @param [Integer] offset 返回偏移量,用于分页控制

  • @param [Hash] filters 过滤条件,key/value分别指定过滤字段名称和值,支持的字段名称为:name

  • @return [Hash] 包含SSH密钥对列表



270
271
272
273
274
275
# File 'lib/mos-sdk.rb', line 270

def describe_key_pairs(limit=0, offset=0, filters=nil)
  kwargs = {}
  self.parse_array_params(limit, offset, filters, kwargs)
  val = self.request('DescribeKeyPairs', *kwargs)
  val['KeyPairSet']
end

#describe_network_interfaces(iid, limit = 0, offset = 0, filters = nil) ⇒ Object

获取指定虚拟机的网络接口(虚拟网卡)信息

  • @param [String] iid 虚拟机ID

  • @param [Integer] limit 最大返回数量,用于分页控制

  • @param [Integer] offset 返回的偏移量,用于分页控制

  • @param [Hash] filters 返回结果过滤条件,由hash的key/value指定过滤字段名和值

  • @return [Hash] 指定虚拟机的网络接口(虚拟网卡)信息



78
79
80
81
82
83
84
# File 'lib/mos-sdk.rb', line 78

def describe_network_interfaces(iid, limit=0, offset=0, filters=nil)
  kwargs = {}
  kwargs['InstanceId'] = iid
  self.parse_array_params(limit, offset, filters, kwargs)
  val = self.request('DescribeInstanceNetworkInterfaces', *kwargs)
  val['InstanceNetworkInterfaceSet']
end

#describe_templatesObject

获得所有虚拟机模板

  • @return [Hash] 模板列表



31
32
33
34
# File 'lib/mos-sdk.rb', line 31

def describe_templates()
  val = self.request('DescribeTemplates')
  val['TemplateSet']
end

#get_balanceObject

获取帐户余额和最近更新时间

  • @return [Hash] 帐户余额和最近更新时间



38
39
40
# File 'lib/mos-sdk.rb', line 38

def get_balance()
  self.request('GetBalance')
end

#get_instance_contract_info(iid) ⇒ Object

获取虚拟机的租期信息

  • @param [String] iid 虚拟机ID

  • @return [Hash] 虚拟机租期信息,包含过期时间、自动删除时间



101
102
103
104
105
# File 'lib/mos-sdk.rb', line 101

def get_instance_contract_info(iid)
  kwargs = {}
  kwargs['InstanceId'] = iid
  self.request('GetInstanceContractInfo', *kwargs)
end

#get_instance_metadata(iid) ⇒ Object

获取虚拟机的metadata

  • @param [String] iid 虚拟机ID

  • @return [Hash] 一个hash,包含虚拟机所有metadata的key/value



241
242
243
244
245
246
# File 'lib/mos-sdk.rb', line 241

def (iid)
  kwargs = {}
  kwargs['InstanceId'] = iid
  val = self.request('GetInstanceMetadata', *kwargs)
  val['InstanceMetadata']
end

#get_password_data(iid, key_file = nil) ⇒ Object

获取虚拟机的Login帐户信息

  • @param [String] iid 虚拟机ID

  • @param [String] key_file 私钥文件路径,如果虚拟机使用了SSH密钥,需要指定私钥解密password

  • @return [Hash] 虚拟机Login信息,包含帐户名称、密码,如果使用SSH密钥,则还包含密钥ID和名称



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/mos-sdk.rb', line 148

def get_password_data(iid, key_file=nil)
  kwargs = {}
  kwargs['InstanceId'] = iid
  val = self.request('GetPasswordData', *kwargs)
  if val.has_key?('passwordData') && val.has_key?('keypairName')
    if key_file.nil?
      raise Exception('Password is encrypted, please specify private key of keypair %s' % val['keypairName'])
    else
      begin
        f = open(key_file)
      rescue
        puts 'fail to open file'
        exit(-1)
      end

      key = f.read()
      f.close()
      val['passwordData']=Base64.decode64(
          OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, val['passwordData'])
      ).strip
    end
  end
  val
end

#import_key_pair(name, pubkey) ⇒ Object

导入一个用户的SSH公钥,并创建一个SSH密钥对

  • @param [String] name 密钥对名称

  • @param [String] pubkey SSH公钥信息

  • @return [Hash] 创建的SSH密钥对信息



281
282
283
284
285
286
287
# File 'lib/mos-sdk.rb', line 281

def import_key_pair(name, pubkey)
  kwargs = {}
  kwargs['KeyName'] = name
  kwargs['PublicKeyMaterial'] = pubkey
  val = self.request('ImportKeyPair', *kwargs)
  val['KeyPair']
end

#put_instance_metadata(iid, data) ⇒ Object

修改虚拟机的metadata

  • @param [String] iid 虚拟机ID

  • @param [Hash] data 需要增加或修改的metadata信息



251
252
253
254
255
256
257
258
259
260
261
262
263
# File 'lib/mos-sdk.rb', line 251

def (iid, data)
  kwargs = {}
  kwargs['InstanceId'] = iid
  names = []
  values = []
  data.each do |key, value|
    names.push(key)
    values.push(value)
  end
  kwargs['Name'] = names
  kwargs['Value'] = values
  self.request('PutInstanceMetadata', *kwargs)
end

#reboot_instance(iid) ⇒ Object

重启虚拟机

  • @param [String] iid 虚拟机ID



193
194
195
196
197
# File 'lib/mos-sdk.rb', line 193

def reboot_instance(iid)
  kwargs = {}
  kwargs['InstanceId'] = iid
  self.request('RebootInstance', *kwargs)
end

#rebuild_instance_root_image(iid, image_id = nil) ⇒ Object

重置虚拟机系统磁盘

  • @param [String] iid 虚拟机ID

  • @param [String] image_id 将虚拟机系统磁盘用指定镜像模板重置,如果无该参数,则使用原镜像模板重置



210
211
212
213
214
215
# File 'lib/mos-sdk.rb', line 210

def rebuild_instance_root_image(iid, image_id=nil)
  kwargs = {}
  kwargs['InstanceId'] = iid
  kwargs['ImageId'] = image_id if !(image_id.nil?) && image_id.size > 0
  self.request('RebuildInstanceRootImage', *kwargs)
end

#renew_instance(iid, duration = nil) ⇒ Object

虚拟机租期续费

  • @param [String] iid 虚拟机ID

  • @param [String] duration 续费租期,缺省为‘1M’,即一个月



89
90
91
92
93
94
95
96
# File 'lib/mos-sdk.rb', line 89

def renew_instance(iid, duration=nil)
  kwargs = {}
  kwargs['InstanceId'] = iid
  unless duration.nil?
    (/^\d+[HhMm]$/.match(duration)) ? (kwargs['Duration'] = duration) : (raise Exception("Illegal duration %s" % duration))
  end
  self.request('RenewInstance', *kwargs)
end

#start_instance(iid) ⇒ Object

启动虚拟机

  • @param [String] iid 虚拟机ID



175
176
177
178
179
# File 'lib/mos-sdk.rb', line 175

def start_instance(iid)
  kwargs = {}
  kwargs['InstanceId'] = iid
  self.request('StartInstance', *kwargs)
end

#stop_instance(iid, force = false) ⇒ Object

停止虚拟机

  • @param [String] iid 虚拟机ID

  • @param [] force 是否强制停止虚拟机



184
185
186
187
188
189
# File 'lib/mos-sdk.rb', line 184

def stop_instance(iid, force=false)
  kwargs = {}
  kwargs['InstanceId'] = iid
  kwargs['Force'] = force if force
  self.request('StopInstance', *kwargs)
end

#terminate_instance(iid) ⇒ Object

删除虚拟机

  • @param [String] iid 虚拟机ID



201
202
203
204
205
# File 'lib/mos-sdk.rb', line 201

def terminate_instance(iid)
  kwargs = {}
  kwargs['InstanceId'] = iid
  self.request('TerminateInstance', *kwargs)
end