wakame-vdc-dcmgr 11.06.0 → 11.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. data/Rakefile +19 -31
  2. data/bin/collector +6 -1
  3. data/config/db/migrations/0001_v1110_origin.rb +446 -0
  4. data/config/dcmgr.conf.example +51 -0
  5. data/lib/dcmgr.rb +99 -22
  6. data/lib/dcmgr/cli/base.rb +34 -1
  7. data/lib/dcmgr/cli/host.rb +24 -20
  8. data/lib/dcmgr/cli/image.rb +38 -19
  9. data/lib/dcmgr/cli/keypair.rb +16 -12
  10. data/lib/dcmgr/cli/network.rb +189 -81
  11. data/lib/dcmgr/cli/quota.rb +2 -2
  12. data/lib/dcmgr/cli/security_group.rb +106 -0
  13. data/lib/dcmgr/cli/spec.rb +144 -39
  14. data/lib/dcmgr/cli/storage.rb +16 -15
  15. data/lib/dcmgr/cli/tag.rb +20 -14
  16. data/lib/dcmgr/cli/vlan.rb +5 -5
  17. data/lib/dcmgr/drivers/backing_store.rb +32 -0
  18. data/lib/dcmgr/drivers/comstar.rb +81 -0
  19. data/lib/dcmgr/drivers/iijgio_storage.rb +9 -19
  20. data/lib/dcmgr/drivers/iscsi_target.rb +41 -0
  21. data/lib/dcmgr/drivers/kvm.rb +161 -28
  22. data/lib/dcmgr/drivers/linux_iscsi.rb +60 -0
  23. data/lib/dcmgr/drivers/local_storage.rb +24 -0
  24. data/lib/dcmgr/drivers/lxc.rb +167 -125
  25. data/lib/dcmgr/drivers/raw.rb +74 -0
  26. data/lib/dcmgr/drivers/s3_storage.rb +7 -19
  27. data/lib/dcmgr/drivers/snapshot_storage.rb +18 -28
  28. data/lib/dcmgr/drivers/storage_initiator.rb +28 -0
  29. data/lib/dcmgr/drivers/sun_iscsi.rb +32 -0
  30. data/lib/dcmgr/drivers/zfs.rb +77 -0
  31. data/lib/dcmgr/endpoints/core_api.rb +315 -263
  32. data/lib/dcmgr/endpoints/errors.rb +21 -10
  33. data/lib/dcmgr/endpoints/metadata.rb +360 -23
  34. data/lib/dcmgr/helpers/cli_helper.rb +6 -3
  35. data/lib/dcmgr/helpers/ec2_metadata_helper.rb +9 -0
  36. data/lib/dcmgr/helpers/nic_helper.rb +11 -0
  37. data/lib/dcmgr/helpers/snapshot_storage_helper.rb +34 -0
  38. data/lib/dcmgr/models/account.rb +0 -6
  39. data/lib/dcmgr/models/account_resource.rb +0 -4
  40. data/lib/dcmgr/models/base_new.rb +14 -2
  41. data/lib/dcmgr/models/dhcp_range.rb +38 -0
  42. data/lib/dcmgr/models/frontend_system.rb +0 -6
  43. data/lib/dcmgr/models/history.rb +0 -11
  44. data/lib/dcmgr/models/host_node.rb +131 -0
  45. data/lib/dcmgr/models/hostname_lease.rb +0 -8
  46. data/lib/dcmgr/models/image.rb +31 -18
  47. data/lib/dcmgr/models/instance.rb +137 -143
  48. data/lib/dcmgr/models/instance_nic.rb +52 -29
  49. data/lib/dcmgr/models/instance_security_group.rb +9 -0
  50. data/lib/dcmgr/models/instance_spec.rb +163 -31
  51. data/lib/dcmgr/models/ip_lease.rb +10 -21
  52. data/lib/dcmgr/models/mac_lease.rb +30 -11
  53. data/lib/dcmgr/models/network.rb +148 -27
  54. data/lib/dcmgr/models/physical_network.rb +18 -0
  55. data/lib/dcmgr/models/quota.rb +0 -10
  56. data/lib/dcmgr/models/request_log.rb +3 -18
  57. data/lib/dcmgr/models/security_group.rb +66 -0
  58. data/lib/dcmgr/models/security_group_rule.rb +145 -0
  59. data/lib/dcmgr/models/ssh_key_pair.rb +16 -19
  60. data/lib/dcmgr/models/{storage_pool.rb → storage_node.rb} +35 -25
  61. data/lib/dcmgr/models/tag.rb +0 -14
  62. data/lib/dcmgr/models/tag_mapping.rb +1 -7
  63. data/lib/dcmgr/models/vlan_lease.rb +2 -8
  64. data/lib/dcmgr/models/volume.rb +49 -37
  65. data/lib/dcmgr/models/volume_snapshot.rb +15 -17
  66. data/lib/dcmgr/node_modules/hva_collector.rb +69 -28
  67. data/lib/dcmgr/node_modules/instance_ha.rb +23 -12
  68. data/lib/dcmgr/node_modules/instance_monitor.rb +16 -2
  69. data/lib/dcmgr/node_modules/openflow_controller.rb +784 -0
  70. data/lib/dcmgr/node_modules/scheduler.rb +189 -0
  71. data/lib/dcmgr/node_modules/service_netfilter.rb +452 -227
  72. data/lib/dcmgr/node_modules/service_openflow.rb +731 -0
  73. data/lib/dcmgr/node_modules/sta_collector.rb +20 -0
  74. data/lib/dcmgr/node_modules/sta_tgt_initializer.rb +35 -0
  75. data/lib/dcmgr/rack/request_logger.rb +11 -6
  76. data/lib/dcmgr/rpc/hva_handler.rb +256 -110
  77. data/lib/dcmgr/rpc/sta_handler.rb +244 -0
  78. data/lib/dcmgr/scheduler.rb +122 -8
  79. data/lib/dcmgr/scheduler/host_node/exclude_same.rb +24 -0
  80. data/lib/dcmgr/scheduler/host_node/find_first.rb +12 -0
  81. data/lib/dcmgr/scheduler/host_node/least_usage.rb +28 -0
  82. data/lib/dcmgr/scheduler/host_node/per_instance.rb +18 -0
  83. data/lib/dcmgr/scheduler/host_node/specify_node.rb +26 -0
  84. data/lib/dcmgr/scheduler/network/flat_single.rb +23 -0
  85. data/lib/dcmgr/scheduler/network/nat_one_to_one.rb +23 -0
  86. data/lib/dcmgr/scheduler/network/per_instance.rb +39 -0
  87. data/lib/dcmgr/scheduler/network/vif_template.rb +19 -0
  88. data/lib/dcmgr/scheduler/storage_node/find_first.rb +13 -0
  89. data/lib/dcmgr/scheduler/storage_node/least_usage.rb +23 -0
  90. data/lib/dcmgr/storage_service.rb +39 -40
  91. data/lib/dcmgr/tags.rb +3 -3
  92. data/lib/dcmgr/version.rb +1 -1
  93. data/lib/dcmgr/vnet.rb +105 -0
  94. data/lib/dcmgr/vnet/factories.rb +141 -0
  95. data/lib/dcmgr/vnet/isolators/by_securitygroup.rb +21 -0
  96. data/lib/dcmgr/vnet/isolators/dummy.rb +17 -0
  97. data/lib/dcmgr/vnet/netfilter/cache.rb +51 -0
  98. data/lib/dcmgr/vnet/netfilter/chain.rb +66 -0
  99. data/lib/dcmgr/vnet/netfilter/controller.rb +193 -0
  100. data/lib/dcmgr/vnet/netfilter/ebtables_rule.rb +53 -0
  101. data/lib/dcmgr/vnet/netfilter/iptables_rule.rb +45 -0
  102. data/lib/dcmgr/vnet/netfilter/task_manager.rb +459 -0
  103. data/lib/dcmgr/vnet/tasks/accept_all_dns.rb +19 -0
  104. data/lib/dcmgr/vnet/tasks/accept_arp_broadcast.rb +24 -0
  105. data/lib/dcmgr/vnet/tasks/accept_arp_from_friends.rb +34 -0
  106. data/lib/dcmgr/vnet/tasks/accept_arp_from_gateway.rb +21 -0
  107. data/lib/dcmgr/vnet/tasks/accept_arp_to_host.rb +30 -0
  108. data/lib/dcmgr/vnet/tasks/accept_ip_from_friends.rb +26 -0
  109. data/lib/dcmgr/vnet/tasks/accept_ip_from_gateway.rb +23 -0
  110. data/lib/dcmgr/vnet/tasks/accept_ip_to_anywhere.rb +18 -0
  111. data/lib/dcmgr/vnet/tasks/accept_related_established.rb +45 -0
  112. data/lib/dcmgr/vnet/tasks/accept_wakame_dhcp_only.rb +33 -0
  113. data/lib/dcmgr/vnet/tasks/accept_wakame_dns_only.rb +33 -0
  114. data/lib/dcmgr/vnet/tasks/debug_iptables.rb +21 -0
  115. data/lib/dcmgr/vnet/tasks/drop_arp_forwarding.rb +27 -0
  116. data/lib/dcmgr/vnet/tasks/drop_arp_to_host.rb +24 -0
  117. data/lib/dcmgr/vnet/tasks/drop_ip_from_anywhere.rb +18 -0
  118. data/lib/dcmgr/vnet/tasks/drop_ip_spoofing.rb +34 -0
  119. data/lib/dcmgr/vnet/tasks/drop_mac_spoofing.rb +33 -0
  120. data/lib/dcmgr/vnet/tasks/exclude_from_nat.rb +47 -0
  121. data/lib/dcmgr/vnet/tasks/security_group.rb +37 -0
  122. data/lib/dcmgr/vnet/tasks/static_nat.rb +54 -0
  123. data/lib/dcmgr/vnet/tasks/translate_metadata_address.rb +32 -0
  124. data/web/metadata/config.ru +1 -1
  125. metadata +174 -89
  126. data/lib/dcmgr/cli/group.rb +0 -101
  127. data/lib/dcmgr/endpoints/core_api_mock.rb +0 -865
  128. data/lib/dcmgr/models/host_pool.rb +0 -122
  129. data/lib/dcmgr/models/instance_netfilter_group.rb +0 -16
  130. data/lib/dcmgr/models/netfilter_group.rb +0 -89
  131. data/lib/dcmgr/models/netfilter_rule.rb +0 -21
  132. data/lib/dcmgr/scheduler/find_last.rb +0 -16
  133. data/lib/dcmgr/scheduler/find_random.rb +0 -16
  134. data/lib/dcmgr/stm/instance.rb +0 -25
  135. data/lib/dcmgr/stm/snapshot_context.rb +0 -33
  136. data/lib/dcmgr/stm/volume_context.rb +0 -65
@@ -43,15 +43,6 @@ module Dcmgr::Models
43
43
  class Tag < AccountResource
44
44
  taggable('tag')
45
45
 
46
- inheritable_schema do
47
- Fixnum :type_id, :null=>false
48
- String :name, :null=>false
49
- String :attributes
50
-
51
- index [:account_id, :type_id, :name], {:unique=>true}
52
- end
53
- with_timestamps
54
-
55
46
  many_to_one :account
56
47
 
57
48
  one_to_many :mapped_uuids, :class=>TagMapping do |ds|
@@ -160,10 +151,5 @@ module Dcmgr::Models
160
151
  def to_api_document
161
152
  to_hash.merge({:type_id=>self.class.to_s.split('::').last})
162
153
  end
163
-
164
- def self.declare(account_id, tag_class_name, name)
165
- Dcmgr::Tags.const_get(tag_class_name).find_or_create(:account_id=>account_id,
166
- :name=>name)
167
- end
168
154
  end
169
155
  end
@@ -2,13 +2,7 @@
2
2
 
3
3
  module Dcmgr::Models
4
4
  class TagMapping < BaseNew
5
- inheritable_schema do
6
- Fixnum :tag_id, :null=>false
7
- String :uuid, :null=>false, :size=>20
8
- index :tag_id
9
- index :uuid
10
- end
11
-
5
+
12
6
  many_to_one :tag
13
7
 
14
8
  end
@@ -5,17 +5,11 @@ module Dcmgr::Models
5
5
  class VlanLease < AccountResource
6
6
  taggable 'vlan'
7
7
 
8
- inheritable_schema do
9
- Fixnum :tag_id, :null=>false
10
-
11
- index :tag_id, {:unique=>true}
12
- end
13
- with_timestamps
14
-
15
8
  one_to_many :networks
16
9
 
17
10
  def validate
18
-
11
+ super
12
+
19
13
  unless 1 <= self.tag_id.to_i && self.tag_id.to_i <= 4095
20
14
  errors.add(:tag_id, "Tag ID is out of range (1-4095)")
21
15
  end
@@ -1,5 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
- require 'statemachine'
3
2
 
4
3
  module Dcmgr::Models
5
4
  class Volume < AccountResource
@@ -21,31 +20,7 @@ module Dcmgr::Models
21
20
  STATE_TYPE_DELETING = "deleting"
22
21
  STATE_TYPE_DELETED = "deleted"
23
22
 
24
- inheritable_schema do
25
- Fixnum :storage_pool_id, :null=>false
26
- String :status, :null=>false, :default=>STATUS_TYPE_REGISTERING
27
- String :state, :null=>false, :default=>STATE_TYPE_REGISTERING
28
- Fixnum :size, :null=>false
29
- Fixnum :instance_id
30
- Fixnum :boot_dev, :null=>false, :default=>0
31
- String :snapshot_id
32
- String :host_device_name
33
- String :guest_device_name
34
- String :export_path, :null=>false
35
- # String :intermediate_path, :null=>false
36
- Text :transport_information
37
- Time :deleted_at
38
- Time :attached_at
39
- Time :detached_at
40
-
41
- index :storage_pool_id
42
- index :instance_id
43
- index :snapshot_id
44
- index :deleted_at
45
- end
46
- with_timestamps
47
-
48
- many_to_one :storage_pool
23
+ many_to_one :storage_node, :after_set=>:validate_storage_node_assigned
49
24
  many_to_one :instance
50
25
 
51
26
  plugin ArchiveChangedColumn, :histories
@@ -65,25 +40,38 @@ module Dcmgr::Models
65
40
  # iscsi:
66
41
  # {:iqn=>'iqn.1986-03.com.sun:02:a1024afa-775b-65cf-b5b0-aa17f3476bfc', :lun=>0}
67
42
  plugin :serialization, :yaml, :transport_information
43
+ plugin :serialization, :yaml, :request_params
68
44
 
69
- class DiskError < RuntimeError; end
45
+ class CapacityError < RuntimeError; end
70
46
  class RequestError < RuntimeError; end
71
47
 
72
- def before_create
73
- sp = self.storage_pool
48
+ def validate_storage_node_assigned(sp)
49
+ unless sp.is_a?(StorageNode)
50
+ raise "unknown class: #{sp.class}"
51
+ end
74
52
  volume_size = sp.volumes_dataset.lives.sum(:size).to_i
75
53
  # check if the sum of available volume and new volume is under
76
54
  # the limit of offering capacity.
77
55
  total_size = sp.offering_disk_space - volume_size.to_i
78
56
  if self.size > total_size
79
- raise DiskError, "out of disk space"
57
+ raise CapacityError, "Allocation exceeds storage node blank size: #{}"
80
58
  end
81
-
82
- # TODO: Here may not be the right place for capacity validation.
83
- per_account_totoal = self.class.filter(:account_id=>self.account_id).lives.sum(:size).to_i
84
- if self.account.quota.volume_total_size < per_account_totoal + self.size.to_i
85
- raise DiskError, "Out of account quota: #{self.account.quota.volume_total_size}, #{self.size.to_i}, #{per_account_totoal}"
59
+ end
60
+
61
+ def validate
62
+ # do not run validation if the row is maked as deleted.
63
+ return true if self.deleted_at
64
+
65
+ if new?
66
+ # TODO: Here may not be the right place for capacity validation.
67
+ per_account_total = self.class.filter(:account_id=>self.account_id).lives.sum(:size).to_i
68
+ if self.account.quota.volume_total_size < per_account_total + self.size.to_i
69
+ raise CapacityError, "Allocation exceeds account's quota: #{self.account.quota.volume_total_size}, #{self.size.to_i}, #{per_account_total}"
70
+ end
86
71
  end
72
+
73
+ errors.add(:size, "Invalid volume size.") if self.size == 0
74
+
87
75
  super
88
76
  end
89
77
 
@@ -125,7 +113,7 @@ module Dcmgr::Models
125
113
 
126
114
  def merge_pool_data
127
115
  v = self.to_hash
128
- v.merge(:storage_pool=>storage_pool.to_hash)
116
+ v.merge(:storage_node=>storage_node.to_hash)
129
117
  end
130
118
 
131
119
  def to_hash
@@ -157,9 +145,33 @@ module Dcmgr::Models
157
145
 
158
146
  def create_snapshot(account_id)
159
147
  vs = VolumeSnapshot.create(:account_id=>account_id,
160
- :storage_pool_id=>self.storage_pool_id,
148
+ :storage_node_id=>self.storage_node_id,
161
149
  :origin_volume_id=>self.canonical_uuid,
162
150
  :size=>self.size)
163
151
  end
152
+
153
+ # override Sequel::Model#delete not to delete rows but to set
154
+ # delete flags.
155
+ def delete
156
+ self.deleted_at ||= Time.now
157
+ self.state = :deleted if self.state != :deleted
158
+ self.status = :offline if self.status != :offline
159
+ self.save
160
+ end
161
+
162
+ def snapshot
163
+ VolumeSnapshot[self.snapshot_id]
164
+ end
165
+
166
+ def self.entry_new(account, size, params, &blk)
167
+ # Mash is passed in some cases.
168
+ raise ArgumentError unless params.class == ::Hash
169
+ v = self.new &blk
170
+ v.account_id = account.canonical_uuid
171
+ v.size = size
172
+ v.request_params = params
173
+ v
174
+ end
175
+
164
176
  end
165
177
  end
@@ -11,22 +11,11 @@ module Dcmgr::Models
11
11
  STATE_TYPE_DELETING = "deleting"
12
12
  STATE_TYPE_DELETED = "deleted"
13
13
 
14
- inheritable_schema do
15
- Fixnum :storage_pool_id, :null=>false
16
- String :origin_volume_id, :null=>false
17
- Fixnum :size, :null=>false
18
- Fixnum :status, :null=>false, :default=>0
19
- String :state, :null=>false, :default=>STATE_TYPE_REGISTERING
20
- String :destination_key, :null=>false
21
- Time :deleted_at
22
- index :storage_pool_id
23
- index :deleted_at
24
- end
25
- with_timestamps
26
-
27
- many_to_one :storage_pool
14
+ many_to_one :storage_node
28
15
  plugin ArchiveChangedColumn, :histories
29
16
 
17
+ subset(:alives, {:deleted_at => nil})
18
+
30
19
  RECENT_TERMED_PERIOD=(60 * 15)
31
20
  # lists the volumes are available and deleted within
32
21
  # RECENT_TERMED_PERIOD sec.
@@ -46,15 +35,16 @@ module Dcmgr::Models
46
35
  :origin_volume_id => self.origin_volume_id,
47
36
  :destination_id => self.destination,
48
37
  :destination_name => self.display_name,
38
+ :backing_store => self.storage_node.storage_type,
49
39
  :created_at => self.created_at,
50
40
  :deleted_at => self.deleted_at,
51
41
  }
52
42
  end
53
43
 
54
44
  # create volume inherite from this snapshot for the account.
55
- # limitation: inherit volume is created on same storage_pool.
45
+ # limitation: inherit volume is created on same storage_node.
56
46
  def create_volume(account_id)
57
- storage_pool.create_volume(account_id, self.size, self.canonical_uuid)
47
+ storage_node.create_volume(account_id, self.size, self.canonical_uuid)
58
48
  end
59
49
 
60
50
  def display_name
@@ -68,7 +58,7 @@ module Dcmgr::Models
68
58
  end
69
59
 
70
60
  def snapshot_filename
71
- "#{self.canonical_uuid}.zsnap"
61
+ "#{self.canonical_uuid}.snap"
72
62
  end
73
63
 
74
64
  def destination
@@ -83,6 +73,14 @@ module Dcmgr::Models
83
73
  vs.state = :deleting
84
74
  vs.save_changes
85
75
  end
76
+
77
+ # override Sequel::Model#delete not to delete rows but to set
78
+ # delete flags.
79
+ def delete
80
+ self.state = :deleted if self.state != :deleted
81
+ self.deleted_at ||= Time.now
82
+ self.save
83
+ end
86
84
 
87
85
  def update_destination_key(account_id, destination_key)
88
86
  self.destination_key = destination_key
@@ -46,11 +46,11 @@ module Dcmgr
46
46
  nil
47
47
  end
48
48
 
49
- def get_netfilter_groups_of_instance(instance_id)
49
+ def get_security_groups_of_instance(instance_id)
50
50
  inst = Models::Instance[instance_id]
51
51
  raise "UnknownInstanceID" if inst.nil?
52
52
 
53
- inst.netfilter_groups.map { |g| g.to_hash }
53
+ inst.security_groups.map { |g| g.to_hash }
54
54
  end
55
55
 
56
56
  #Returns an array containing the ip addresses of all instances in the same security group.
@@ -63,8 +63,10 @@ module Dcmgr
63
63
  raise "UnknownInstanceID" if inst.nil?
64
64
  raise "Unknown ip set." unless [:inside,:all,:outside].member?(set)
65
65
 
66
- inst.netfilter_groups.compact.map { |netfilter_group|
67
- netfilter_group.instances_dataset.lives.all.compact.map { |instance|
66
+ inst.security_groups.compact.map { |security_group|
67
+ # do not include 'stopped' or 'scheduling' instances as they
68
+ # are not allocated IP address.
69
+ security_group.instances_dataset.runnings.all.compact.map { |instance|
68
70
  instance.ips.compact.map { |ip|
69
71
  case set
70
72
  when :all
@@ -79,23 +81,32 @@ module Dcmgr
79
81
  }.flatten.uniq.compact
80
82
  end
81
83
 
82
- # def get_instances_of_account_netfilter_group(account_id, netfilter_group_id)
83
- def get_instances_of_account_netfilter_group(account_id, netfilter_group_name)
84
- ng_map = Models::NetfilterGroup.find(:account_id => account_id, :name => netfilter_group_name)
85
- raise "UnknownNetfilterGroupID" if ng_map.nil?
86
- inst_maps = ng_map.instances_dataset.lives.all.map { |inst| inst.to_hash }.flatten.uniq.compact
87
- inst_maps
88
- end
89
-
90
84
  def get_network(network_id)
91
85
  network = Models::Network[network_id]
92
86
  raise "UnknownNetworkID" if network.nil?
93
87
  network.to_hash
94
88
  end
95
89
 
90
+ def get_nic(nic_uuid)
91
+ nic = Models::Taggable.find(nic_uuid)
92
+ raise "UnknownNIC" if nic.nil?
93
+ nic.to_hash
94
+ end
95
+
96
+ def get_instance_of_nic(nic_uuid)
97
+ nic = Models::Taggable.find(nic_uuid)
98
+ raise "UnknownNIC" if nic.nil?
99
+
100
+ instance = nic.instance
101
+ raise "UnknownInstance" if instance.nil?
102
+
103
+ instance.to_hash
104
+ end
105
+
96
106
  #Returns the current iplease for nic with uuid _nic_uuid_
97
107
  def get_iplease_for_nic(nic_uuid)
98
108
  nic = Models::Taggable.find(nic_uuid)
109
+ raise "UnknownNIC" if nic.nil?
99
110
  Models::IpLease.find(:instance_nic_id => nic[:id])[:ipv4]
100
111
  end
101
112
 
@@ -125,13 +136,13 @@ module Dcmgr
125
136
 
126
137
  def get_dhcp_conf(network_name)
127
138
  build_network_segment = proc { |network|
128
- gwaddr = network.ipaddress
139
+ nwaddr = network.ipv4_ipaddress
129
140
  h = {
130
141
  :uuid => network.canonical_uuid,
131
- :ipv4_first => gwaddr.network.first.to_s,
132
- :ipv4_last => gwaddr.network.last.to_s,
133
- :ipv4_gw=>network.ipv4_gw,
134
- :netmask => gwaddr.network.prefix.to_ip,
142
+ :ipv4_first => nwaddr.first.to_s,
143
+ :ipv4_last => nwaddr.last.to_s,
144
+ :ipv4_gw=> network.ipv4_gw,
145
+ :netmask => nwaddr.prefix.to_ip,
135
146
  :prefix => network.prefix,
136
147
  :dns_server=> network.dns_server,
137
148
  :domain_name => network.domain_name,
@@ -149,8 +160,8 @@ module Dcmgr
149
160
  :ipaddr => ip.ipv4
150
161
  }
151
162
  h[:addr2host] << {
152
- :hostname => ip.instance_nic.instance.fqdn_hostname,
153
- :ipaddr => network.nat_network.nil? ? ip.ipv4 : ip.nat_outside_lease.ipv4
163
+ :hostname => ip.instance_nic.fqdn_hostname,
164
+ :ipaddr => ip.instance_nic.nat_network_id.nil? ? ip.ipv4 : ip.nat_outside_lease.ipv4
154
165
  }
155
166
  }
156
167
 
@@ -168,6 +179,7 @@ module Dcmgr
168
179
  else
169
180
  raise "Unknown network name: #{network_name}"
170
181
  end
182
+
171
183
  h = {}
172
184
  network_set.each {|n|
173
185
  h[n.canonical_uuid] = build_network_segment.call(n)
@@ -175,30 +187,59 @@ module Dcmgr
175
187
  h
176
188
  end
177
189
 
178
- def get_instances_of_netfilter_group(netfilter_group_id)
179
- g = Models::NetfilterGroup[netfilter_group_id]
180
- raise "UnknownNetfilterGroupID" if g.nil?
181
- g.instances.map {|i| i.to_hash }.flatten.uniq.compact
190
+ def get_instances_of_security_group(security_group_uuid)
191
+ sg_map = Models::SecurityGroup[security_group_uuid]
192
+ raise "Unknown security group ID: #{security_group_uuid}" if sg_map.nil?
193
+ # do not include 'stopped' or 'scheduling' instances as they
194
+ # are not allocated IP address.
195
+ inst_maps = sg_map.instances_dataset.runnings.all.map { |inst| inst.to_hash }.flatten.uniq.compact
196
+ inst_maps
182
197
  end
183
198
 
184
199
  def get_alive_instances(node_id)
185
- hp = Models::HostPool.find(:node_id => node_id)
200
+ hp = Models::HostNode.find(:node_id => node_id)
186
201
  if hp.nil?
187
- logger.error("The node ID is not bound to HostPool yet: #{node_id}")
202
+ logger.error("The node ID is not bound to HostNode yet: #{node_id}")
188
203
  return []
189
204
  end
190
- hps = Models::HostPool.where(:account_id => hp.account_id).all
205
+ hps = Models::HostNode.where(:account_id => hp.account_id).all
191
206
  inst_on_hp = hps.map { |hp|
192
- inst_on_hp = hp.instances_dataset.lives.all.map { |inst|
207
+ inst_on_hp = hp.instances_dataset.runnings.all.map { |inst|
193
208
  inst_map = inst.to_hash
194
209
  # Does the hva have instance?
195
- next unless inst_map[:host_pool][:node_id] == node_id
210
+ next unless inst_map[:host_node][:node_id] == node_id
196
211
  inst_map
197
212
  }
198
213
  }.flatten.uniq.compact
199
214
  inst_on_hp
200
215
  end
201
216
 
217
+ # Method designed to get all data needed for the netfilter service in a single request
218
+ def get_netfilter_data(node_id)
219
+ inst_maps = get_alive_instances(node_id)
220
+
221
+ #Determine which security groups are in use
222
+ secg_uuids = inst_maps.map { |inst_map|
223
+ inst_map[:security_groups]
224
+ }.flatten.uniq
225
+
226
+ secg_maps = Models::SecurityGroup.map { |secg|
227
+ secg.to_hash if secg_uuids.member? secg.canonical_uuid
228
+ }.compact
229
+
230
+ # Trim out the data netfilter doesn't need and return a clean hash
231
+ {
232
+ :instances => inst_maps.map { |inst_map|
233
+ {
234
+ :uuid => inst_map[:uuid],
235
+ :security_groups => inst_map[:security_groups],
236
+ :vif => inst_map[:vif].map { |vif| vif.merge({:security_groups => inst_map[:security_groups]}) }# <-- Just putting the security groups in vif for the vnet isolator, gonna properly do this in the database asap
237
+ }
238
+ },
239
+ :security_groups => secg_maps
240
+ }
241
+ end
242
+
202
243
  end
203
244
  end
204
245
  end
@@ -5,7 +5,7 @@ module Dcmgr
5
5
  module NodeModules
6
6
  class InstanceHA < Isono::NodeModules::Base
7
7
  include Dcmgr::Logger
8
-
8
+
9
9
  initialize_hook do
10
10
  @thread_pool = Isono::ThreadPool.new(1, 'InstanceHA')
11
11
  event = Isono::NodeModules::EventChannel.new(node)
@@ -26,12 +26,19 @@ module Dcmgr
26
26
 
27
27
  def restart_instance(inst)
28
28
  # terminate and cleanup
29
+
30
+ # set boot_vol before instance is cleaned up.
31
+ case inst.image.boot_dev_type
32
+ when Models::Image::BOOT_DEV_SAN
33
+ boot_vol = inst.volume.find {|v| v.boot_dev == 1 }
34
+ end
35
+
29
36
  begin
30
- jobrpc.run("kvm-handle.#{inst.host_pool.node_id}", 'cleanup', inst.canonical_uuid)
37
+ jobrpc.run("hva-handle.#{inst.host_node.node_id}", 'cleanup', inst.canonical_uuid)
31
38
  rescue => e
32
39
  # termination may fail
33
40
  end
34
-
41
+
35
42
  # TODO: pick a new host node
36
43
  Isono::NodeModules::DataStore.barrier {
37
44
  inst.state = :failingover
@@ -39,18 +46,22 @@ module Dcmgr
39
46
  }
40
47
 
41
48
  # start a new backup instance
42
- case inst.image.boot_dev_type
43
- when Models::Image::BOOT_DEV_SAN
44
- boot_vol = inst.volume.find {|v| v.boot_dev == 1 }
45
- res = jobrpc.submit("kvm-handle.#{inst.host_pool.node_id}", 'run_vol_store', inst.canonical_uuid, boot_vol.canonical_uuid)
46
- when Models::Image::BOOT_DEV_LOCAL
47
- res = jobrpc.submit("kvm-handle.#{inst.host_pool.node_id}", 'run_local_store', inst.canonical_uuid)
48
- else
49
- raise "Unknown boot type"
49
+ begin
50
+ case inst.image.boot_dev_type
51
+ when Models::Image::BOOT_DEV_SAN
52
+ jobrpc.submit("scheduler", 'schedule_instance_ha', inst.canonical_uuid, boot_vol)
53
+ when Models::Image::BOOT_DEV_LOCAL
54
+ jobrpc.submit("scheduler", 'schedule_instance_ha', inst.canonical_uuid, nil)
55
+ else
56
+ raise "Unknown boot type"
57
+ end
58
+ rescue => e
59
+ # termination may fail
50
60
  end
61
+
51
62
  logger.info("#{inst.canonical_uuid} has been restarted")
52
63
  end
53
-
64
+
54
65
  private
55
66
  def event
56
67
  @event ||= Isono::NodeModules::EventChannel.new(node)