yao 0.18.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a30ea9865b8d2944f386d9fe9cfc843a6414b1de2fe3fa53f0515c6679042697
4
- data.tar.gz: 3e3ff0f51fccd67726f8e70e5801db2299963d7627898312a4640e37027bc8ad
3
+ metadata.gz: 390b05f4ca044196755551231ee7f297900816c3742318bcc502b0376e70512a
4
+ data.tar.gz: 0a6bb49a598bb7667d488ce316280ed3504b5ab2c3e0f97da0019783a5f6a939
5
5
  SHA512:
6
- metadata.gz: 7b13454b9f63ce5388d5f5402a7b75db56a23a080ede490748d9928ac2a96e6d094418e3e247b120a3d41224d7896e732d1e8a19d12d13c84e0a73a9dc3d86d9
7
- data.tar.gz: a3fdc1732d6d1853c612a204180968f6a62accddf65c66b74983f23bacbfd89bf699e4bb30086c6e10ba9eaefa7976ed8357b9da7e32c98bc046dd60f394d206
6
+ metadata.gz: 731688676c2b1b9d120ef76f67131de2b060a25b8e3c9cb0b1cbf138c6a58fe632220c7f02c87c58972ee51c40f0d902bca2e69d254cd9eecd427d3960a1740b
7
+ data.tar.gz: 63b4adfd5b841b0c4b99c262b8cc2235a980165c574db4b60dab8b39ba39b4b659b0d4761286e81a48e61f33a57821ba1167b1bd53ba35387fb6f1c0b37dc2cc
@@ -4,10 +4,9 @@ module Yao::Resources
4
4
  class Aggregates < Base
5
5
  friendly_attributes :availability_zone, :deleted, :hosts, :metadata, :name
6
6
 
7
- # @return [Date]
8
- def deleted_at
9
- Date.parse(self["deleted_at"]) if self["deleted_at"]
10
- end
7
+ map_attributes_to_time :created_at, :updated_at, :deleted_at
8
+ alias :created :created_at
9
+ alias :updated :updated_at
11
10
 
12
11
  self.service = "compute"
13
12
  self.resources_name = "aggregates"
@@ -4,9 +4,22 @@ require 'time'
4
4
  module Yao::Resources
5
5
  class Base
6
6
 
7
+ # @param name [String]
8
+ def self.add_instantiation_name_list(name)
9
+ @instantiation_list ||= []
10
+ @instantiation_list << name
11
+ end
12
+
13
+ # @param name [String]
14
+ # @return [bool]
15
+ def self.instantiation?(name)
16
+ @instantiation_list.include?(name)
17
+ end
18
+
7
19
  # @param name [Array]
8
20
  def self.friendly_attributes(*names)
9
21
  names.map(&:to_s).each do |name|
22
+ add_instantiation_name_list(name)
10
23
  define_method(name) do
11
24
  self[name]
12
25
  end
@@ -17,6 +30,7 @@ module Yao::Resources
17
30
  # @return [Symbol]
18
31
  def self.map_attribute_to_attribute(k_and_v)
19
32
  as_json, as_method = *k_and_v.to_a.first.map(&:to_s)
33
+ add_instantiation_name_list(as_method)
20
34
  define_method(as_method) do
21
35
  self[as_json]
22
36
  end
@@ -27,6 +41,7 @@ module Yao::Resources
27
41
  def self.map_attribute_to_resource(k_and_v)
28
42
  _name, klass = *k_and_v.to_a.first
29
43
  name = _name.to_s
44
+ add_instantiation_name_list(name)
30
45
  define_method(name) do
31
46
  unless self[name].empty?
32
47
  self[[name, klass].join("__")] ||= klass.new(self[name])
@@ -39,6 +54,7 @@ module Yao::Resources
39
54
  def self.map_attribute_to_resources(k_and_v)
40
55
  _name, klass = *k_and_v.to_a.first
41
56
  name = _name.to_s
57
+ add_instantiation_name_list(name)
42
58
  define_method(name) do
43
59
  self[[name, klass].join("__")] ||= self[name].map {|d|
44
60
  klass.new(d)
@@ -46,6 +62,17 @@ module Yao::Resources
46
62
  end
47
63
  end
48
64
 
65
+ # @param names [Array<Symbol>]
66
+ # @return [Symbol]
67
+ def self.map_attributes_to_time(*names)
68
+ names.map(&:to_s).each do |name|
69
+ add_instantiation_name_list(name)
70
+ define_method(name) do
71
+ Time.parse(self[name])
72
+ end
73
+ end
74
+ end
75
+
49
76
  # @param data_via_json [Hash]
50
77
  # @return [Hash]
51
78
  def initialize(data_via_json)
@@ -55,7 +82,7 @@ module Yao::Resources
55
82
  # @param name [String]
56
83
  # @return [String]
57
84
  def [](name)
58
- unless @data["id"].nil? || @data.key?(name) || name.include?("__")
85
+ if @data["id"] && !@data.key?(name) && self.class.instantiation?(name)
59
86
  @data = self.class.get(@data["id"]).to_hash
60
87
  end
61
88
  @data[name]
@@ -78,20 +105,6 @@ module Yao::Resources
78
105
  self["id"]
79
106
  end
80
107
 
81
- # @return [Date]
82
- def created
83
- if date = self["created_at"] || self["created"]
84
- Time.parse(date)
85
- end
86
- end
87
-
88
- # @return [Date]
89
- def updated
90
- if date = self["updated_at"] || self["updated"]
91
- Time.parse(date)
92
- end
93
- end
94
-
95
108
  # @param resource_params [Hash]
96
109
  # @return [Yao::Resources::*]
97
110
  def update(resource_params)
@@ -2,6 +2,9 @@ module Yao::Resources
2
2
  class ComputeServices < Base
3
3
  friendly_attributes :status, :binary, :host, :zone, :state, :disabled_reason, :forced_down
4
4
 
5
+ map_attributes_to_time :updated_at
6
+ alias :updated :updated_at
7
+
5
8
  self.service = "compute"
6
9
  self.resource_name = "service"
7
10
  self.resources_name = "os-services"
@@ -18,6 +21,11 @@ module Yao::Resources
18
21
  status == 'disabled'
19
22
  end
20
23
 
24
+ # @return []
25
+ def delete
26
+ self.class.delete(id)
27
+ end
28
+
21
29
  class << self
22
30
  # @param host [String]
23
31
  # @param binary [String]
@@ -10,6 +10,10 @@ module Yao::Resources
10
10
  :floating_ip_address,
11
11
  :status, :port_details, :tags, :port_forwardings
12
12
 
13
+ map_attributes_to_time :created_at, :updated_at
14
+ alias :created :created_at
15
+ alias :updated :updated_at
16
+
13
17
  self.service = "network"
14
18
  self.resource_name = "floatingip"
15
19
  self.resources_name = "floatingips"
@@ -6,6 +6,10 @@ module Yao::Resources
6
6
  map_attribute_to_resources listeners: LoadBalancerListener
7
7
  map_attribute_to_resources pools: LoadBalancerPool
8
8
 
9
+ map_attributes_to_time :created_at, :updated_at
10
+ alias :created :created_at
11
+ alias :updated :updated_at
12
+
9
13
  # @return [Yao::Resources::Tenant]
10
14
  def project
11
15
  if project_id = self["project_id"]
@@ -7,6 +7,10 @@ module Yao::Resources
7
7
 
8
8
  map_attribute_to_resources pools: LoadBalancerListener
9
9
 
10
+ map_attributes_to_time :created_at, :updated_at
11
+ alias :created :created_at
12
+ alias :updated :updated_at
13
+
10
14
  # @return [Date]
11
15
  def created_at
12
16
  Date.parse(self["created_at"])
@@ -8,6 +8,10 @@ module Yao::Resources
8
8
 
9
9
  map_attribute_to_resources loadbalancers: LoadBalancer
10
10
 
11
+ map_attributes_to_time :created_at, :updated_at
12
+ alias :created :created_at
13
+ alias :updated :updated_at
14
+
11
15
  # @return [Yao::Resources::Tenant]
12
16
  def project
13
17
  if project_id = self["project_id"]
@@ -7,6 +7,10 @@ module Yao::Resources
7
7
  map_attribute_to_resources loadbalancers: LoadBalancer
8
8
  map_attribute_to_resources listeners: LoadBalancerListener
9
9
 
10
+ map_attributes_to_time :created_at, :updated_at
11
+ alias :created :created_at
12
+ alias :updated :updated_at
13
+
10
14
  # @return [Yao::Resources::LoadBalancerListener]
11
15
  def listeners
12
16
  @listeners ||= self["listeners"].map do |listener|
@@ -5,6 +5,10 @@ module Yao::Resources
5
5
  :monitor_address, :address,
6
6
  :protocol_port, :operating_status
7
7
 
8
+ map_attributes_to_time :created_at, :updated_at
9
+ alias :created :created_at
10
+ alias :updated :updated_at
11
+
8
12
  # @return [Yao::Resources::Tenant]
9
13
  def project
10
14
  if project_id = self["project_id"]
@@ -2,7 +2,7 @@ module Yao::Resources
2
2
  class Network < Base
3
3
  include ProjectAssociationable
4
4
 
5
- friendly_attributes :name, :status, :shared, :subnets, :admin_state_up
5
+ friendly_attributes :name, :status, :shared, :admin_state_up
6
6
  map_attribute_to_attribute "provider:physical_network" => :physical_network
7
7
  map_attribute_to_attribute "provider:network_type" => :type
8
8
  map_attribute_to_attribute "provider:segmentation_id" => :segmentation_id
@@ -17,5 +17,10 @@ module Yao::Resources
17
17
  def ports
18
18
  @ports ||= Yao::Port.list(network_id: id)
19
19
  end
20
+
21
+ # @return [Array<Yao::Resources::Subnet>]
22
+ def subnets
23
+ @subnets ||= self['subnets'].map {|id| Yao::Subnet.new("id" => id)}
24
+ end
20
25
  end
21
26
  end
@@ -25,6 +25,11 @@ module Yao::Resources
25
25
  Time.parse(self["heartbeat_timestamp"])
26
26
  end
27
27
 
28
+ # @return []
29
+ def delete
30
+ self.class.delete(id)
31
+ end
32
+
28
33
  alias :state :admin_state_up
29
34
  end
30
35
  end
@@ -106,9 +106,8 @@ module Yao::Resources
106
106
  r = GET(url, query).body
107
107
  if r.is_a?(Hash)
108
108
  res.deep_merge!(r)
109
- links = r.find {|k,_| k =~ /links/ }
110
- if links && links.last.is_a?(Array) && next_link = links.last.find{|s| s["rel"] == "next" }
111
- uri = URI.parse(next_link["href"])
109
+ if next_link = find_next_link(r)
110
+ uri = URI.parse(next_link)
112
111
  query = Hash[URI::decode_www_form(uri.query)] if uri.query
113
112
  next
114
113
  end
@@ -127,6 +126,16 @@ module Yao::Resources
127
126
  # @note .list is defined to keep backward compatibility and will be deprecated
128
127
  alias :list_detail :list
129
128
 
129
+ # @param response [Hash]
130
+ # @return [String]
131
+ def find_next_link(response)
132
+ if links = response.find {|k, v| k =~ /links/ && v.is_a?(Array) }&.last
133
+ links.find{|s| s["rel"] == "next" }&.fetch("href")
134
+ else
135
+ response["next"]
136
+ end
137
+ end
138
+
130
139
  # @param id_or_name_or_permalink [Stirng]
131
140
  # @param query [Hash]
132
141
  # @return [Yao::Resources::*]
@@ -20,6 +20,10 @@ module Yao::Resources
20
20
  map_attribute_to_attribute 'OS-EXT-STS:task_state' => :ext_sts_task_state
21
21
  map_attribute_to_attribute 'OS-EXT-STS:vm_state' => :ext_sts_vm_state
22
22
 
23
+ map_attributes_to_time :created, :updated
24
+ alias :created_at :created
25
+ alias :updated_at :updated
26
+
23
27
  self.service = "compute"
24
28
  self.resource_name = "server"
25
29
  self.resources_name = "servers"
@@ -43,6 +47,52 @@ module Yao::Resources
43
47
  action(id, "os-start" => nil)
44
48
  end
45
49
 
50
+ # @return [Hash]
51
+ def start
52
+ self.class.start(id)
53
+ end
54
+
55
+ # @return [Hash]
56
+ def shutoff
57
+ self.class.shutoff(id)
58
+ end
59
+ alias :stop :shutoff
60
+
61
+ # @return [Hash]
62
+ def reboot
63
+ self.class.reboot(id)
64
+ end
65
+
66
+ # @return [Hash]
67
+ def resize(flavor_id)
68
+ self.class.resize(id, flavor_id)
69
+ end
70
+
71
+ # @param id [String]
72
+ # @param host [String]
73
+ # @param block_migration [Boolean]
74
+ # @param disk_over_commit [Boolean]
75
+ # @param opts [Hash]
76
+ # @return [Hash]
77
+ def live_migrate(host = nil, block_migration = false, disk_over_commit = false, opts = {})
78
+ self.class.live_migrate(id, host, block_migration, disk_over_commit, opts)
79
+ end
80
+
81
+ # @return [Hash]
82
+ def add_security_group(sg_name)
83
+ self.class.add_security_group(id, sg_name)
84
+ end
85
+
86
+ # @return [Hash]
87
+ def remove_security_group(sg_name)
88
+ self.class.remove_security_group(id, sg_name)
89
+ end
90
+
91
+ # @return [Hash]
92
+ def get_vnc_console
93
+ self.class.get_vnc_console(id)
94
+ end
95
+
46
96
  # @param id [String]
47
97
  # @return [Hash]
48
98
  def self.shutoff(id)
@@ -62,6 +112,21 @@ module Yao::Resources
62
112
  action(id,"resize" => { "flavorRef" => flavor_id })
63
113
  end
64
114
 
115
+ # @param id [String]
116
+ # @param host [String]
117
+ # @param block_migration [Boolean]
118
+ # @param disk_over_commit [Boolean]
119
+ # @param opts [Hash]
120
+ # @return [Hash]
121
+ def self.live_migrate(id, host = nil, block_migration = false, disk_over_commit = false, opts ={})
122
+ query = {
123
+ "host" => host,
124
+ "block_migration" => block_migration,
125
+ "disk_over_commit" => disk_over_commit,
126
+ }.merge(opts)
127
+ action(id, "os-migrateLive" => query)
128
+ end
129
+
65
130
  # @param id [String]
66
131
  # @param sg_name [String]
67
132
  # @return [Hash]
@@ -77,7 +142,7 @@ module Yao::Resources
77
142
  end
78
143
 
79
144
  # @param id [String]
80
- # @return [Hash]
145
+ # @return [String]
81
146
  def self.get_vnc_console(id)
82
147
  response = action(id, {"os-getVNCConsole": {"type": "novnc"}})
83
148
  response.dig("console", "url")
@@ -0,0 +1,15 @@
1
+ module Yao::Resources
2
+ class ServerMigrate < Base
3
+ friendly_attributes :dest_compute, :dest_host, :dest_node, :instance_uuid, :new_instance_type_id, :old_instance_type_id,
4
+ :source_compute, :source_node, :status, :migration_type, :uuid, :user_id, :project_id
5
+ map_attributes_to_time :created_at, :updated_at
6
+
7
+ self.service = "compute"
8
+ self.resource_name = "migrations"
9
+ self.resources_name = "os-migrations"
10
+
11
+ def server
12
+ @server ||= Yao::Server.get(self["instance_uuid"])
13
+ end
14
+ end
15
+ end
@@ -10,6 +10,10 @@ module Yao::Resources
10
10
  map_attribute_to_attribute 'os-vol-host-attr:host' => :host
11
11
  map_attribute_to_attribute 'os-vol-tenant-attr:tenant_id' => :tenant_id
12
12
 
13
+ map_attributes_to_time :created_at, :updated_at
14
+ alias :created :created_at
15
+ alias :updated :updated_at
16
+
13
17
  self.service = "volumev3"
14
18
  self.resource_name = "volume"
15
19
  self.resources_name = "volumes"
@@ -0,0 +1,76 @@
1
+ module Yao::Resources
2
+ class VolumeServices < Base
3
+
4
+ friendly_attributes :binary, :disabled_reason, :host, :state, :status,
5
+ :frozen, :zone, :cluster, :replication_status,
6
+ :active_backend_id, :backed_state
7
+ map_attributes_to_time :updated_at
8
+
9
+ self.service = "volumev3"
10
+ self.resource_name = "os-service"
11
+ self.resources_name = "os-services"
12
+
13
+ # return true if ComputeServices is enabled
14
+ # @return [Bool]
15
+ def enabled?
16
+ status == 'enabled'
17
+ end
18
+
19
+ # return true if ComputeServices is disabled
20
+ # @return [Bool]
21
+ def disabled?
22
+ status == 'disabled'
23
+ end
24
+
25
+ def enable
26
+ self.class.enable(host, binary)
27
+ end
28
+
29
+ def disable(reason = nil)
30
+ self.class.disable(host, binary, reason)
31
+ end
32
+
33
+ class << self
34
+ # @param host [String]
35
+ # @param binary [String]
36
+ # @return [Hash]
37
+ def enable(host, binary)
38
+ params = {
39
+ "host" => host,
40
+ "binary" => binary,
41
+ }
42
+ put("enable", params)
43
+ end
44
+
45
+ # @param host [String]
46
+ # @param binary [String]
47
+ # @param resason [String]
48
+ # @return [Hash]
49
+ def disable(host, binary, reason = nil)
50
+ params = {
51
+ "host" => host,
52
+ "binary" => binary,
53
+ }
54
+ if reason
55
+ params["disabled_reason"] = reason
56
+ put("disable-log-reason", params)
57
+ else
58
+ put("disable", params)
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ # @param path [String]
65
+ # @param params [Hash]
66
+ # @return [Hash]
67
+ def put(path, params)
68
+ res = PUT(create_url(path), params) do |req|
69
+ req.body = params.to_json
70
+ req.headers['Content-Type'] = 'application/json'
71
+ end
72
+ res.body
73
+ end
74
+ end
75
+ end
76
+ end
data/lib/yao/resources.rb CHANGED
@@ -8,6 +8,7 @@ module Yao
8
8
 
9
9
  autoload :Server, "yao/resources/server"
10
10
  autoload :ServerGroup, "yao/resources/server_group"
11
+ autoload :ServerMigrate, "yao/resources/server_migrate"
11
12
  autoload :Flavor, "yao/resources/flavor"
12
13
  autoload :Image, "yao/resources/image"
13
14
  autoload :SecurityGroup, "yao/resources/security_group"
@@ -33,6 +34,7 @@ module Yao
33
34
  autoload :Role, "yao/resources/role"
34
35
  autoload :RoleAssignment, "yao/resources/role_assignment"
35
36
  autoload :Volume, "yao/resources/volume"
37
+ autoload :VolumeServices, "yao/resources/volume_services"
36
38
  autoload :VolumeType, "yao/resources/volume_type"
37
39
  autoload :ComputeServices, "yao/resources/compute_services"
38
40
  autoload :Project, "yao/resources/project"
data/lib/yao/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Yao
2
- VERSION = "0.18.0"
2
+ VERSION = "0.20.0"
3
3
  end
@@ -40,6 +40,40 @@ module RestfullyAccessibleStub
40
40
  )
41
41
  end
42
42
 
43
+ def stub_post_request(url, body, response = {})
44
+ stub_request(:post,url)
45
+ .with(
46
+ headers: request_headers
47
+ ).to_return(
48
+ status: 202,
49
+ headers: {'Content-Type' => 'application/json'},
50
+ body: response.to_json
51
+ )
52
+ end
53
+
54
+ def stub_put_request(url, body, response = {})
55
+ stub_request(:put,url)
56
+ .with(
57
+ headers: request_headers.merge({'Content-Type' => 'application/json'}),
58
+ body: body.to_json,
59
+ ).to_return(
60
+ status: 200,
61
+ headers: {'Content-Type' => 'application/json'},
62
+ body: response.to_json
63
+ )
64
+ end
65
+
66
+ def stub_delete_request(url, response = {})
67
+ stub_request(:delete,url)
68
+ .with(
69
+ headers: request_headers
70
+ ).to_return(
71
+ status: 200,
72
+ headers: {'Content-Type' => 'application/json'},
73
+ body: response.to_json
74
+ )
75
+ end
76
+
43
77
  def request_headers
44
78
  {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>"Yao/#{Yao::VERSION} Faraday/#{Faraday::VERSION}"}
45
79
  end
@@ -19,6 +19,6 @@ class TestAggregates < TestYaoResource
19
19
  assert_equal("nova", aggregates.name)
20
20
  assert_equal(Time.parse("2015-08-27T09:49:58-05:00"), aggregates.created)
21
21
  assert_equal(Time.parse("2015-08-27T09:49:58-05:00"), aggregates.updated)
22
- assert_equal(Date.parse("2015-08-27T09:49:58-05:00"), aggregates.deleted_at)
22
+ assert_equal(Time.parse("2015-08-27T09:49:58-05:00"), aggregates.deleted_at)
23
23
  end
24
24
  end
@@ -1,4 +1,5 @@
1
1
  class TestComputeServices < TestYaoResource
2
+ include RestfullyAccessibleStub
2
3
 
3
4
  def test_compute_services
4
5
 
@@ -127,4 +128,11 @@ class TestComputeServices < TestYaoResource
127
128
 
128
129
  assert_requested stub
129
130
  end
131
+
132
+ def test_delete
133
+ stub = stub_delete_request("https://example.com:12345/os-services/test-id")
134
+ compute_service = Yao::ComputeServices.new({"id" => "test-id"})
135
+ assert_equal({}, compute_service.delete)
136
+ assert_requested(stub)
137
+ end
130
138
  end
@@ -14,7 +14,7 @@ class TestNetwork < TestYaoResource
14
14
  "router:external" => false,
15
15
  "shared" => false,
16
16
  "status" => "ACTIVE",
17
- "subnets" => [],
17
+ "subnets" => ["52822b63-eb89-496d-9509-f91473b9d85d"],
18
18
  "tenant_id" => "c05140b3dc7c4555afff9fab6b58edc2",
19
19
  "project_id" => "c05140b3dc7c4555afff9fab6b58edc2",
20
20
  }
@@ -28,13 +28,15 @@ class TestNetwork < TestYaoResource
28
28
  assert_equal(false, network.shared)
29
29
  assert_equal(false, network.shared?)
30
30
  assert_equal("c05140b3dc7c4555afff9fab6b58edc2", network.tenant_id)
31
- assert_equal([], network.subnets)
32
31
  assert_equal(true, network.admin_state_up)
33
32
 
34
33
  #map_attribute_to_attribute
35
34
  assert_equal("physnet1", network.physical_network)
36
35
  assert_equal("vlan", network.type)
37
36
  assert_equal(1000, network.segmentation_id)
37
+
38
+ assert_equal(Yao::Subnet, network.subnets.first.class)
39
+ assert_equal("52822b63-eb89-496d-9509-f91473b9d85d", network.subnets.first.id)
38
40
  end
39
41
 
40
42
  def test_project
@@ -1,4 +1,5 @@
1
1
  class TestNetworkingAgents < TestYaoResource
2
+ include RestfullyAccessibleStub
2
3
 
3
4
  def test_networking_agents
4
5
 
@@ -81,4 +82,11 @@ class TestNetworkingAgents < TestYaoResource
81
82
  assert_equal(Time.parse("2017-09-12 19:35:38"), agent.created_at)
82
83
  assert_equal(Time.parse("2017-09-12 19:35:38"), agent.started_at)
83
84
  end
85
+
86
+ def test_delete
87
+ stub = stub_delete_request("https://example.com:12345/agents/test-id")
88
+ agents = Yao::NetworkingAgents.new({"id" => "test-id"})
89
+ assert_equal({}, agents.delete)
90
+ assert_requested(stub)
91
+ end
84
92
  end
@@ -1,4 +1,5 @@
1
1
  class TestServer < TestYaoResource
2
+ include RestfullyAccessibleStub
2
3
 
3
4
  def test_server
4
5
 
@@ -273,4 +274,98 @@ class TestServer < TestYaoResource
273
274
  assert_equal(0, ports.size)
274
275
  assert_requested(stub)
275
276
  end
277
+
278
+ def test_start
279
+ server_id = '2ce4c5b3-2866-4972-93ce-77a2ea46a7f9'
280
+ stub = stub_post_request(
281
+ "https://example.com:12345/servers/#{server_id}/action",
282
+ [{"os-start": nil}]
283
+ )
284
+
285
+ Yao::Server.new('id' => server_id).start
286
+ assert_requested(stub)
287
+ end
288
+
289
+ def test_shutoff
290
+ server_id = '2ce4c5b3-2866-4972-93ce-77a2ea46a7f9'
291
+ stub = stub_post_request(
292
+ "https://example.com:12345/servers/#{server_id}/action",
293
+ [{"os-stop": nil}]
294
+ )
295
+
296
+ Yao::Server.new('id' => server_id).stop
297
+ assert_requested(stub)
298
+ assert_equal(Yao::Server.method(:stop), Yao::Server.method(:shutoff))
299
+ end
300
+
301
+ def test_reboot
302
+ server_id = '2ce4c5b3-2866-4972-93ce-77a2ea46a7f9'
303
+ stub = stub_post_request(
304
+ "https://example.com:12345/servers/#{server_id}/action",
305
+ [{"reboot": { "type" => "HARD" }}]
306
+ )
307
+
308
+ Yao::Server.new('id' => server_id).reboot
309
+ assert_requested(stub)
310
+ end
311
+
312
+ def test_resize
313
+ server_id = '2ce4c5b3-2866-4972-93ce-77a2ea46a7f9'
314
+ stub = stub_post_request(
315
+ "https://example.com:12345/servers/#{server_id}/action",
316
+ [{"resize": { "flavorRef": "test-flavor" }}]
317
+ )
318
+
319
+ Yao::Server.new('id' => server_id).resize("test-flavor")
320
+ assert_requested(stub)
321
+ end
322
+
323
+ def test_live_migrate
324
+ server_id = '2ce4c5b3-2866-4972-93ce-77a2ea46a7f9'
325
+ stub = stub_post_request(
326
+ "https://example.com:12345/servers/#{server_id}/action",
327
+ [{"os-migrateLive": {
328
+ "host": "test-node-1",
329
+ "block_migration": false,
330
+ "disk_over_commit": false
331
+ }}]
332
+ )
333
+
334
+ Yao::Server.new('id' => server_id).live_migrate("test-node-1", false, false)
335
+ assert_requested(stub)
336
+ end
337
+
338
+ def test_add_security_group
339
+ server_id = '2ce4c5b3-2866-4972-93ce-77a2ea46a7f9'
340
+ stub = stub_post_request(
341
+ "https://example.com:12345/servers/#{server_id}/action",
342
+ [{"addSecurityGroup": { "name": "test-sg" }}]
343
+ )
344
+
345
+ Yao::Server.new('id' => server_id).add_security_group("test-sg")
346
+ assert_requested(stub)
347
+ end
348
+
349
+ def test_remove_security_group
350
+ server_id = '2ce4c5b3-2866-4972-93ce-77a2ea46a7f9'
351
+ stub = stub_post_request(
352
+ "https://example.com:12345/servers/#{server_id}/action",
353
+ [{"removeSecurityGroup": { "name": "test-sg" }}]
354
+ )
355
+
356
+ Yao::Server.new('id' => server_id).remove_security_group("test-sg")
357
+ assert_requested(stub)
358
+ end
359
+
360
+ def test_get_vnc_concolse
361
+ server_id = '2ce4c5b3-2866-4972-93ce-77a2ea46a7f9'
362
+ stub = stub_post_request(
363
+ "https://example.com:12345/servers/#{server_id}/action",
364
+ [{"os-getVNCConsole": { "type": "novnc" }}],
365
+ {"console": { "url": "https://example.com/vnc" }}
366
+ )
367
+
368
+ Yao::Server.new('id' => server_id).get_vnc_console
369
+ assert_requested(stub)
370
+ end
276
371
  end
@@ -0,0 +1,33 @@
1
+ class TestServerGroup < TestYaoResource
2
+ def test_server_group
3
+ # https://docs.openstack.org/api-ref/compute/?expanded=list-migrations-detail#list-migrations
4
+ params = {
5
+ "created_at" => "2012-10-29T13:42:02.000000",
6
+ "dest_compute" => "compute2",
7
+ "dest_host" => "1.2.3.4",
8
+ "dest_node" => "node2",
9
+ "id" => 1234,
10
+ "instance_uuid" => "8600d31b-d1a1-4632-b2ff-45c2be1a70ff",
11
+ "new_instance_type_id" => 2,
12
+ "old_instance_type_id" => 1,
13
+ "source_compute" => "compute1",
14
+ "source_node" => "node1",
15
+ "status" => "done",
16
+ "updated_at" => "2012-10-29T13:42:02.000000"
17
+ }
18
+
19
+ migrate = Yao::ServerMigrate.new(params)
20
+ assert_equal(Time.parse("2012-10-29T13:42:02.000000"), migrate.created_at)
21
+ assert_equal("compute2", migrate.dest_compute)
22
+ assert_equal("1.2.3.4", migrate.dest_host)
23
+ assert_equal("node2", migrate.dest_node)
24
+ assert_equal(1234, migrate.id)
25
+ assert_equal("8600d31b-d1a1-4632-b2ff-45c2be1a70ff", migrate.instance_uuid)
26
+ assert_equal(2, migrate.new_instance_type_id)
27
+ assert_equal(1, migrate.old_instance_type_id)
28
+ assert_equal("compute1", migrate.source_compute)
29
+ assert_equal("node1", migrate.source_node)
30
+ assert_equal("done", migrate.status)
31
+ assert_equal(Time.parse("2012-10-29T13:42:02.000000"), migrate.updated_at)
32
+ end
33
+ end
@@ -13,7 +13,9 @@ class TestVolume < TestYaoResource
13
13
  'snapshot_id' => nil,
14
14
  'status' => 'available',
15
15
  'user_id' => 'aaaa166533fd49f3b11b1cdce2430000',
16
- 'volume_type' => 'test'
16
+ 'volume_type' => 'test',
17
+ 'created_at' => '2018-11-28T06:25:15.288987',
18
+ 'updated_at' => '2019-11-28T06:25:15.288987'
17
19
  }
18
20
 
19
21
  volume = Yao::Volume.new(params)
@@ -30,6 +32,10 @@ class TestVolume < TestYaoResource
30
32
  assert_equal(volume.user_id, 'aaaa166533fd49f3b11b1cdce2430000')
31
33
  assert_equal(volume.volume_type, 'test')
32
34
  assert_equal(volume.type, 'test')
35
+ assert_equal(Time.parse('2018-11-28T06:25:15.288987'), volume.created_at)
36
+ assert_equal(Time.parse('2018-11-28T06:25:15.288987'), volume.created)
37
+ assert_equal(Time.parse('2019-11-28T06:25:15.288987'), volume.updated_at)
38
+ assert_equal(Time.parse('2019-11-28T06:25:15.288987'), volume.updated)
33
39
  end
34
40
 
35
41
  def test_list
@@ -0,0 +1,116 @@
1
+ class TestVolumeServices < TestYaoResource
2
+ include RestfullyAccessibleStub
3
+
4
+ def test_volume_services
5
+ # https://docs.openstack.org/api-ref/block-storage/v3/index.html?expanded=list-all-cinder-services-detail#list-all-cinder-services
6
+ params = JSON.parse(<<~JSON)
7
+ {
8
+ "status": "enabled",
9
+ "binary": "cinder-scheduler",
10
+ "zone": "nova",
11
+ "state": "up",
12
+ "updated_at": "2017-06-29T05:50:35.000000",
13
+ "host": "devstack",
14
+ "disabled_reason": null
15
+ }
16
+ JSON
17
+
18
+ service = Yao::VolumeServices.new(params)
19
+ assert_equal('enabled', service.status)
20
+ assert_equal('cinder-scheduler', service.binary)
21
+ assert_equal('nova', service.zone)
22
+ assert_equal('up', service.state)
23
+ assert_equal(Time.parse('2017-06-29T05:50:35.000000'), service.updated_at)
24
+ assert_equal('devstack', service.host)
25
+ assert_equal(nil, service.disabled_reason)
26
+ end
27
+
28
+ def test_enabled
29
+ service = Yao::VolumeServices.new({'status' => 'enabled'})
30
+ assert_equal(true, service.enabled?)
31
+ end
32
+
33
+ def test_disabled
34
+ service = Yao::VolumeServices.new({'status' => 'enabled'})
35
+ assert_equal(false, service.disabled?)
36
+ end
37
+
38
+ def stub_enable_request
39
+ body = {
40
+ "host" => "test-host",
41
+ "binary" => "test-binary",
42
+ }
43
+ response = { "disabled" => false }
44
+ stub_put_request('https://example.com:12345/os-services/enable', body, response)
45
+ end
46
+
47
+ def test_enable
48
+ stub = stub_enable_request
49
+ service = Yao::VolumeServices.new({
50
+ "host" => "test-host",
51
+ "binary" => "test-binary",
52
+ })
53
+ response = service.enable
54
+ assert_equal(false, response['disabled'])
55
+ assert_requested(stub)
56
+ end
57
+
58
+ def test_self_enable
59
+ stub = stub_enable_request
60
+ response = Yao::VolumeServices.enable('test-host', 'test-binary')
61
+ assert_equal(false, response['disabled'])
62
+ assert_requested(stub)
63
+ end
64
+
65
+ def stub_disable_request(reason = nil)
66
+ body = {
67
+ "host" => "test-host",
68
+ "binary" => "test-binary",
69
+ }
70
+ response = { "disabled" => true }
71
+ if reason
72
+ body["disabled_reason"] = reason
73
+ response["disabled_reason"] = reason
74
+ stub_put_request('https://example.com:12345/os-services/disable-log-reason', body, response)
75
+ else
76
+ stub_put_request('https://example.com:12345/os-services/disable', body, response)
77
+ end
78
+ end
79
+
80
+ def test_disable
81
+ stub = stub_disable_request
82
+ service = Yao::VolumeServices.new({
83
+ "host" => "test-host",
84
+ "binary" => "test-binary",
85
+ })
86
+ response = service.disable
87
+ assert_equal(true, response['disabled'])
88
+ assert_requested(stub)
89
+ end
90
+
91
+ def test_disable_reason
92
+ stub = stub_disable_request('test-reason')
93
+ service = Yao::VolumeServices.new({
94
+ "host" => "test-host",
95
+ "binary" => "test-binary",
96
+ })
97
+ response = service.disable('test-reason')
98
+ assert_equal(true, response['disabled'])
99
+ assert_equal('test-reason', response['disabled_reason'])
100
+ assert_requested(stub)
101
+ end
102
+
103
+ def test_self_disable
104
+ stub = stub_disable_request
105
+ response = Yao::VolumeServices.disable('test-host', 'test-binary')
106
+ assert_equal(true, response['disabled'])
107
+ assert_requested(stub)
108
+ end
109
+
110
+ def test_self_disable_reason
111
+ stub = stub_disable_request('test-reason')
112
+ response = Yao::VolumeServices.disable('test-host', 'test-binary', 'test-reason')
113
+ assert_equal(true, response['disabled'])
114
+ assert_requested(stub)
115
+ end
116
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yao
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uchio, KONDO
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-28 00:00:00.000000000 Z
11
+ date: 2023-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -133,12 +133,14 @@ files:
133
133
  - lib/yao/resources/security_group_rule.rb
134
134
  - lib/yao/resources/server.rb
135
135
  - lib/yao/resources/server_group.rb
136
+ - lib/yao/resources/server_migrate.rb
136
137
  - lib/yao/resources/server_usage_associationable.rb
137
138
  - lib/yao/resources/subnet.rb
138
139
  - lib/yao/resources/tenant.rb
139
140
  - lib/yao/resources/user.rb
140
141
  - lib/yao/resources/volume.rb
141
142
  - lib/yao/resources/volume_action.rb
143
+ - lib/yao/resources/volume_services.rb
142
144
  - lib/yao/resources/volume_type.rb
143
145
  - lib/yao/setup.rb
144
146
  - lib/yao/token.rb
@@ -182,9 +184,11 @@ files:
182
184
  - test/yao/resources/test_security_group_rule.rb
183
185
  - test/yao/resources/test_server.rb
184
186
  - test/yao/resources/test_server_group.rb
187
+ - test/yao/resources/test_server_migrate.rb
185
188
  - test/yao/resources/test_subnet.rb
186
189
  - test/yao/resources/test_user.rb
187
190
  - test/yao/resources/test_volume.rb
191
+ - test/yao/resources/test_volume_services.rb
188
192
  - test/yao/resources/test_volume_type.rb
189
193
  - test/yao/test_auth.rb
190
194
  - test/yao/test_authv3.rb
@@ -216,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
216
220
  - !ruby/object:Gem::Version
217
221
  version: '0'
218
222
  requirements: []
219
- rubygems_version: 3.3.7
223
+ rubygems_version: 3.4.6
220
224
  signing_key:
221
225
  specification_version: 4
222
226
  summary: Yet Another OpenStack API Wrapper that rocks!!
@@ -259,9 +263,11 @@ test_files:
259
263
  - test/yao/resources/test_security_group_rule.rb
260
264
  - test/yao/resources/test_server.rb
261
265
  - test/yao/resources/test_server_group.rb
266
+ - test/yao/resources/test_server_migrate.rb
262
267
  - test/yao/resources/test_subnet.rb
263
268
  - test/yao/resources/test_user.rb
264
269
  - test/yao/resources/test_volume.rb
270
+ - test/yao/resources/test_volume_services.rb
265
271
  - test/yao/resources/test_volume_type.rb
266
272
  - test/yao/test_auth.rb
267
273
  - test/yao/test_authv3.rb